Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Aktualisieren Sie das varbinary(MAX)-Feld in SQLServer 2012. Die letzten 4 Bits sind verloren gegangen

Es scheint, dass die binäre Konstante 0xFFD8F...6DC0676 die Sie für das Update verwendet haben, enthält eine ungerade Anzahl von Hexadezimalziffern. Und der SqlServer fügte am Anfang des Musters ein halbes Byte hinzu, sodass es eine ganze Anzahl von Bytes darstellt.

Sie können den gleichen Effekt sehen, wenn Sie die folgende einfache Abfrage ausführen:

select 0x1, 0x104

Dies gibt 0x01 zurück und 0x0104 .

Die Kürzung kann auf einige Einschränkungen in SSMS zurückzuführen sein, die im folgenden Experiment beobachtet werden können:

declare @b varbinary(max)
set @b = 0x123456789ABCDEF0
set @b = convert(varbinary(max), replicate(@b, 65536/datalength(@b)))
select datalength(@b) DataLength, @b Data

Die zurückgegebenen Ergebnisse sind 65536 und 0x123456789ABCDEF0...EF0123456789ABCD , wenn ich jedoch in SSMS die Datenspalte kopiere, erhalte ich ein Muster mit einer Länge von 43677 Zeichen (ohne führendes 0x), was effektiv 21838,5 Bytes entspricht. Es scheint also, dass Sie sich (falls Sie dies tun) nicht auf lange binäre Datenwerte verlassen sollten, die Sie per Kopieren/Einfügen in SSMS erhalten.

Die zuverlässige Alternative kann die Verwendung einer Zwischenvariablen sein:

declare @data varbinary(max)
select @data = DataXXX from Table_XXX where ID = XXX
update Table_YYY set DataYYY = @data where ID = YYY