2011-01-14 8 views
0

​​と似ていますが、代わりにvarbinary(16)をテキストバージョンに変換したいと思います。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)[email protected] 
select @value = convert(int, (@value/2)), @[email protected] 
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

@value % 2および@value/2は暗黙の変換を行っています。

select @value = convert(int, (@value/2)) intへの明示的な変換を行っていますので、bigintに変換された除算が2,147,483,647より大きい場合は、varbinary(16)に格納されている値が負のintになります。負のintの場合、 %は-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 
+0

乾杯。フルレンジを得るために、私はCLR関数を作成する必要があります。 – Nat

関連する問題