Considere as duas instruções a seguir:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
As duas instruções retornam -1
; não é incorreto, pois o segundo valor binário é decimal 65.536 mais alto que o primeiro valor, não é?
Certamente isso não pode ser devido ao truncamento silencioso?
Se eu executar as seguintes instruções:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
Sou apresentado com o seguinte erro:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Como posso diagnosticar o que está acontecendo aqui?
Estou executando isso no SQL Server 2012, v11.0.5058. Os resultados são os mesmos no SQL Server 2008 R2 SP2, no SQL Server 2005 e no SQL Server 2000.
sql-server
sql-server-2008
sql-server-2012
Max Vernon
fonte
fonte
SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);
PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00000001), 0); PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00010001), 0);
.Respostas:
Números decimais e inteiros são codificados de maneira muito diferente em varbinary. Os decimais precisam de mais espaço. Experimentar:
Quanto ao seu objetivo final, armazenar números inteiros como varbinário para economizar espaço, acho que você já respondeu essa pergunta - não vale a pena.
fonte