sql >> Database teknologi >  >> RDS >> Sqlserver

Opdater varbinary(MAX)-feltet i SQLServer 2012 Tabt sidste 4 bit

Det ser ud til, at den binære konstant 0xFFD8F...6DC0676 som du brugte til opdateringen indeholder et ulige antal hex-cifre. Og SQLServeren tilføjede halvbyte i begyndelsen af ​​mønsteret, så det repræsenterer hele antallet af bytes.

Du kan se den samme effekt ved at køre følgende simple forespørgsel:

select 0x1, 0x104

Dette vil returnere 0x01 og 0x0104 .

Trunkeringen kan skyldes nogle begrænsninger i SSMS, som kan observeres i følgende eksperiment:

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

De returnerede resultater er 65536 og 0x123456789ABCDEF0...EF0123456789ABCD Men hvis jeg kopierer datakolonnen i SSMS, får jeg et mønster på 43677 tegn (dette er uden foranstående 0x), hvilket er 21838,5 bytes effektivt. Så det ser ud til, at du ikke (hvis du gør det) bør stole på lange binære dataværdier opnået via copy/paste i SSMS.

Det pålidelige alternativ kan være at bruge mellemvariabel:

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



  1. Alternativ til undtagen i MySQL

  2. Vis forældre-barn-relation, når forældre og barn er gemt i samme tabel

  3. vedligeholde en tilpasset automatisk stigningskolonne

  4. %ENV virker ikke, og jeg kan ikke bruge delt bibliotek