37

SQL Server 2000 を使用して、テーブルからいくつかの値を出力していますPRINT。ほとんどの非文字列データでは、nvarchar にキャストして出力できますが、バイナリ値は文字のビット表現を使用して変換しようとします。例えば:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)

期待される:

0x12345678

代わりに、2 つの意味不明な文字が出力されます。

バイナリデータの値を出力するにはどうすればよいですか? ビルトインはありますか、それとも自分でロールバックする必要がありますか?

更新: これは行の唯一の値ではないため、@binvalue を単に PRINT することはできません。PRINT N'other stuff' + ???? のようなものです。+ N'more stuff'. それが違いを生むかどうかはわかりません: PRINT @binvalue だけを試したわけではありません。

4

7 に答える 7

46

使用しないでください。非常に遅く、文書化されておらず、サポートされmaster.sys.fn_varbintohexstrておらず、SQL Server の将来のバージョンでなくなる可能性があります

binary(16)16 進文字に変換する必要がある場合は、次を使用しconvertます。

convert(char(34), @binvalue, 1)

なぜ34?、それは「0x」であるため16*2 + 2 = 34、2つのシンボルに加えて、各文字に2つのシンボルがあります。

200000 行のテーブルに対して 2 つのクエリを作成しようとしました。

  1. select master.sys.fn_varbintohexstr(field)
    from table`
    
  2. select convert(char(34), field, 1)
    from table`
    

最初のものは 2 分間実行され、2 番目のものは 4 秒です。

于 2012-08-18T06:23:34.430 に答える
29

Sql Server 2005 を使用している場合は、次のように使用できます。

print master.sys.fn_varbintohexstr(@binvalue)

ただし、2000年には存在しないと思うので、自分でロールバックする必要があるかもしれません.

于 2008-09-16T02:23:39.303 に答える
23
select convert(varchar(max), field , 1) 
from table

サイズ(種類)の指定をusing varchar(max)気にする必要はありません。

于 2012-09-23T05:04:08.987 に答える
2
DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

キャストしないでください。

キャストは、特定のデータベースの対応する照合設定の値によって、バイナリをテキストに変換します。

[編集開始] 文字列変数に出力された値が必要な場合は、Eric Z Beard が提案した関数を使用してください。

DECLARE @mybin1 binary(16)
DECLARE @s varchar(100)
SET @mybin1 = 0x098F6BCD4621D373CADE4E832627B4F6
SET @s = 'The value of @mybin1 is: ' + sys.fn_varbintohexsubstring(0, @mybin1,1,0)
PRINT @s

サーバーのバージョンが原因で、または特別な権限が必要なためにこの関数を自由に使用できない場合は、独自の関数を作成できます。

その機能が SQL Server 2005 Express エディションでどのように実装されているかを確認するには、次のコマンドを実行します。

sp_helptext 'fn_varbintohexsubstring'
于 2008-09-16T02:21:33.957 に答える
2

SQL Server 2005 の「hashbytes」関数から返された 16 進値を出力しているときに、同様の問題の解決策を探しているときに、この質問に遭遇しました。

悲しいことに、このバージョンの SQL Server では、CONVERT がまったく機能していないようです。fn_varbintohexsubstring だけが正しいことを行います。

やった:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT 'cast(@binvalue AS nvarchar): ' + CAST(@binvalue AS nvarchar)
PRINT 'convert(varchar(max), @binvalue, 0): ' + CONVERT(varchar(max), @binvalue, 0)
PRINT 'convert(varchar(max), @binvalue, 1): ' + CONVERT(varchar(max), @binvalue, 1)
PRINT 'convert(varchar(max), @binvalue, 2): ' + CONVERT(varchar(max), @binvalue, 2)
print 'master.sys.fn_varbintohexstr(@binvalue): ' + master.sys.fn_varbintohexstr(@binvalue)

これは、SQL Server 2005 で得た結果です (

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 4Vx
convert(varchar(max), @binvalue, 2): 4Vx
master.sys.fn_varbintohexstr(@binvalue): 0x12345678

(実際には「4Vx」の前に印刷できない文字があります-画像を投稿したいのですが、まだ十分なポイントがありません)。


編集:追加するだけです-SQL Server 2008 R2では、CONVERTの問題は次の出力で修正されます:

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 0x12345678
convert(varchar(max), @binvalue, 2): 12345678
master.sys.fn_varbintohexstr(@binvalue): 0x12345678
于 2013-10-16T09:18:34.243 に答える