SQL Server конвертировать varbinary (16) в двоичный текст - PullRequest
0 голосов
/ 14 января 2011

Аналогично этот вопрос (Sql Server преобразует целое число в двоичную строку , но я бы хотел вместо этого преобразовать varbinary (16) в его текстовую версию.

Я делаю что-то трагически неправильно, что подтверждают результаты моего кода.

create function GetGuidBinaryString (@value varbinary(16))
returns varchar(128)
as
begin
declare @vsresult varchar(128) 
declare @inti int 
select @inti = 128, @vsresult = '' 
while @inti>0 
begin 
select @vsresult=convert(char(1), @value % 2)+@vsresult 
select @value = convert(int, (@value / 2)), @inti=@inti-1 
end 

return @vsresult
end


create table #values (binvalue varchar(128))

delete from #values

declare @intcount int
select @intcount = 0
while @intcount < 100
begin
    insert into #values select dbo.GetGuidBinaryString(convert(varbinary(16),convert(bigint,2147483640) + @intcount))
    select @intcount = @intcount+1
end


select * from #values

Возможно, в функции я выполняю неявное преобразование, поскольку функция работает правильно только для натуральных чисел.

1 Ответ

1 голос
/ 14 января 2011

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...