Có vẻ như hằng số nhị phân 0xFFD8F...6DC0676
mà bạn đã sử dụng để cập nhật chứa số lẻ gồm các chữ số hex. Và SqlServer đã thêm nửa byte vào đầu mẫu để nó đại diện cho toàn bộ số byte.
Bạn có thể thấy hiệu ứng tương tự khi chạy truy vấn đơn giản sau:
select 0x1, 0x104
Điều này sẽ trả về 0x01
và 0x0104
.
Việc cắt ngắn có thể do một số hạn chế trong SSMS, có thể quan sát thấy trong thử nghiệm sau:
declare @b varbinary(max)
set @b = 0x123456789ABCDEF0
set @b = convert(varbinary(max), replicate(@b, 65536/datalength(@b)))
select datalength(@b) DataLength, @b Data
Kết quả trả về là 65536
và 0x123456789ABCDEF0...EF0123456789ABCD
, tuy nhiên, nếu trong SSMS tôi sao chép cột Dữ liệu, tôi sẽ nhận được mẫu có độ dài 43677 ký tự (đây là không có 0x đứng đầu), hiệu quả là 21838,5 byte. Vì vậy, có vẻ như bạn không nên (nếu có) dựa vào các giá trị dữ liệu nhị phân dài thu được thông qua sao chép / dán trong SSMS.
Giải pháp thay thế đáng tin cậy có thể là sử dụng biến trung gian:
declare @data varbinary(max)
select @data = DataXXX from Table_XXX where ID = XXX
update Table_YYY set DataYYY = @data where ID = YYY