2009-07-02 40 views
0

私は次のようにその中のデータをVARCHAR(MAX)を取るしようとしている: 「00001001010001010111010101 ...」など文字エンコードされたバイナリ文字列をSQL Serverの16進数に変換するにはどうすればよいですか?

を次にクライアントへのより効率的なリターンの16進としてそれをコードします。

これは可能ですか? master.dbo.fn_varbintohexstrを呼び出す前に、直接、または文字列を実際のバイナリ列に変換するかのどちらかです。一例として、

は、文字列を与えられた:

0000 = 0 
1001 = 9 
0100 = 4 
0101 = 5 
0111 = 7 
0101 = 5 
1110 = E 

094575E:

0000100101000101011101011110 

私たちは、で終わる必要があります。

さらに効率的な方法(バイナリを直接読み込みますか?)がある場合は、それがさらに優れています。 SQL Server 2000互換のソリューションが望ましい

+0

はデータベースで唯一のオプションですか?これはオンデマンドで実行されるか、1回実行されますか? –

+1

...生のバイナリデータを戻すだけで、この種の曲芸師の操作よりも効率的ですか? – Shog9

+0

それは必要ではありませんが、それは必要になるでしょうし、私は可能な限り最小限に抑えていきたいと思います。 –

答えて

4

前の質問がある場合、この文字列を別のクエリの一部として生成しています。なぜ地球上で文字列の代わりにINTを作るために適切な2の累乗でそれらを掛けることができるときに、1と0の文字列を生成していますか? INTから16進数の文字列に変換するのは簡単です。

+0

私は説明しなければならないことを知っていました:)これは基本的にピボットされて連結されていますが、ピボットを使用しないビットフィールドです(2000年の制約内で動かなければなりません)。私はそれが狂ったように見える - しかし、とにかくこれを行う方法はありますか? –

+0

あなたが最終的に解決する解決策があれば、どこかに木製のテーブルがある方が良いでしょう。 – TheTXI

+2

@Kieran Benton:これはラウンドアバウトでやっています。バイナリからストリングに変換してから、ストリングを数値に変換してから16進ストリングに変換します。バイナリから数値に直接変換する方が良いです。そうすれば、どんなベースでも出力できます。あなたは何とか数字の文字列を作成しています。代わりにINTまたはBIGINTを作成するだけです。連結の代わりに加算と乗算を使用します。 – Welbog

-1

あなたはこのような何かを探しています:http://support.microsoft.com/kb/104829

ここでは、リンクが今まで死ぬ場合には次のとおりです。

create procedure sp_hexadecimal 
    @binvalue varbinary(255) 
    as 
    declare @charvalue varchar(255) 
    declare @i int 
    declare @length int 
    declare @hexstring char(16) 

    select @charvalue = '0x' 
    select @i = 1 
    select @length = datalength(@binvalue) 
    select @hexstring = "abcdef" 

    while (@i <= @length) 
    begin 

    declare @tempint int 
    declare @firstint int 
    declare @secondint int 

    select @tempint = convert(int, substring(@binvalue,@i,1)) 
    select @firstint = floor(@tempint/16) 
    select @secondint = @tempint - (@firstint*16) 

    select @charvalue = @charvalue + 
     substring(@hexstring, @firstint+1, 1) + 
     substring(@hexstring, @secondint+1, 1) 

    select @i = @i + 1 

    end 

    select 'sp_hexadecimal'[email protected] 
1

あなたは常に(終わりから始まる!)4つの文字のグループで文字列を分割することができますSUBSTRINGを使用し、4桁の文字グループを16進数にキャストします。ビッグケースステートメントで '0011'から '3'に変更されました。 CASEには16のスイッチケースしかないので、管理が容易です。しかし、トラフィックを減らすためにサーバーのオーバーヘッドに値するかどうかは分かりませんが、長さが4倍に短縮されます。

0

お気に入りの.NET言語を使用してユーザー定義関数を実装する方法があります

関連する問題