Considere las siguientes dos declaraciones:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Ambas declaraciones regresan -1
; ¿No es incorrecto ya que el segundo valor binario es 65.536 decimal más alto que el primer valor, no?
¿Seguramente esto no puede ser debido al truncamiento silencioso?
Si ejecuto las siguientes declaraciones:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
Me aparece el siguiente error:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
¿Cómo puedo diagnosticar lo que está sucediendo aquí?
Estoy ejecutando esto en SQL Server 2012, v11.0.5058. Los resultados son los mismos en SQL Server 2008 R2 SP2, SQL Server 2005 y SQL Server 2000.
sql-server
sql-server-2008
sql-server-2012
Max Vernon
fuente
fuente
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);
.Respuestas:
Los números decimales y enteros se codifican de manera muy diferente en varbinary. Los decimales necesitan más espacio. Tratar:
En cuanto a su objetivo final, almacenar números enteros como varbinary para ahorrar espacio, creo que ha respondido esa pregunta usted mismo, no vale la pena.
fuente