@value % 2
и @value / 2
выполняет неявное преобразование.
select @value = convert(int, (@value / 2))
выполняет явное преобразование в int, поэтому здесь вы получаете отрицательное значение int для значений, хранящихся в varbinary (16), которыепосле того, как разделение, преобразованное в bigint, больше чем 2 147 483 647.% для отрицательного целого даст вам -1.
Я не думаю, что возможно преобразовать varbinary (16) в двоичный файл, используя% и /.Они работают только с int / bigint и т. Д.
Вот процедура преобразования, которая работает для положительных значений bigint.Я не знаю, какое представление вы ожидаете для отрицательных значений bigint.При вызове функции преобразуйте ваше поле varbinary (16) в bigint, и, возможно, оно сделает то, что вы хотите.Я уверен, что он не работает для всех возможных значений, которые вы можете сохранить в поле varbinary (16).
create function BigIntToBin (@v bigint)
returns varchar(256)
as
begin
declare @res varchar(256)
declare @i int
set @i = 128
set @res = ''
while @i > 0
begin
if @v % 2 = 0
set @res = '0' + @res
else
set @res = '1' + @res
set @v = @v / 2
set @i = @i - 1
end
return @res
end