Betrachten Sie die folgenden zwei Aussagen:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Beide Anweisungen kehren zurück -1
. Ist das nicht falsch, da der zweite Binärwert 65.536 Dezimalstellen höher ist als der erste?
Das kann doch nicht an stillem Abschneiden liegen?
Wenn ich die folgenden Anweisungen ausführen:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
Mir wird der folgende Fehler angezeigt:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Wie kann ich diagnostizieren, was hier passiert?
Ich führe dies unter SQL Server 2012, Version 11.0.5058 aus. Die Ergebnisse sind auf SQL Server 2008 R2 SP2, SQL Server 2005 und SQL Server 2000 identisch.
sql-server
sql-server-2008
sql-server-2012
Max Vernon
quelle
quelle
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);
.Antworten:
Dezimal- und Ganzzahlen werden im Varbinary sehr unterschiedlich codiert. Dezimalstellen benötigen mehr Platz. Versuchen:
Was Ihr Endziel angeht, ganze Zahlen als Varbinary zu speichern, um Platz zu sparen, haben Sie diese Frage wahrscheinlich selbst beantwortet - es lohnt sich nicht.
quelle