Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Atualizar o campo varbinary(MAX) no SQLServer 2012 Lost Last 4 bits


Parece que a constante binária 0xFFD8F...6DC0676 que você usou para atualização contém um número ímpar de dígitos hexadecimais. E o SqlServer adicionou meio byte no início do padrão para que ele representasse o número inteiro de bytes.

Você pode ver o mesmo efeito executando a seguinte consulta simples:
select 0x1, 0x104

Isso retornará 0x01 e 0x0104 .

O truncamento pode ser devido a algumas limitações no SSMS, que podem ser observadas no seguinte experimento:
declare @b varbinary(max)
set @b = 0x123456789ABCDEF0
set @b = convert(varbinary(max), replicate(@b, 65536/datalength(@b)))
select datalength(@b) DataLength, @b Data

Os resultados retornados são 65536 e 0x123456789ABCDEF0...EF0123456789ABCD , no entanto, se no SSMS eu copiar a coluna Data, estou obtendo um padrão de 43677 caracteres de comprimento (isso sem o 0x inicial), que é 21838,5 bytes efetivamente. Portanto, parece que você não deve (se o fizer) confiar em valores de dados binários longos obtidos por meio de copiar/colar no SSMS.

A alternativa confiável pode ser usar a variável intermediária:
declare @data varbinary(max)
select @data = DataXXX from Table_XXX where ID = XXX
update Table_YYY set DataYYY = @data where ID = YYY