SQL Server 2000を使用して、PRINT
を使用してテーブルからいくつかの値を出力しています。ほとんどの非文字列データでは、nvarcharにキャストして出力できますが、バイナリ値は文字のビット表現を使用して変換しようとします。例えば:
DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)
期待される:
0x12345678
代わりに、2つの意味不明な文字を印刷します。
バイナリデータの値を出力するにはどうすればよいですか?ビルトインはありますか、または自分でロールする必要がありますか?
更新:これは行の唯一の値ではないため、@ binvalueだけを印刷することはできません。 PRINT N'other stuff '+ ???? + N'more stuff '。それが違いを生むかどうかはわかりません。@ binvalueだけを印刷することはしませんでした。
Sql Server 2005を使用している場合、これを使用できます。
print master.sys.fn_varbintohexstr(@binvalue)
それは2000年には存在しないと思うので、自分でロールする必要があるかもしれません。
_
master.sys.fn_varbintohexstr
_は使用しないでください。ひどく遅い、文書化されていない、サポートされていない、そしてSQL Serverの将来のバージョンではなくなる可能性がありますです。
binary(16)
を16進文字に変換する必要がある場合は、convert
を使用します。
_convert(char(34), @binvalue, 1)
_
なぜ34なのか? _16*2 + 2 = 34
_、つまり "0x"-2つのシンボルと各文字に2つのシンボルがあるため。
200000行のテーブルで2つのクエリを作成しようとしました。
_select master.sys.fn_varbintohexstr(field)
from table`
_
_select convert(char(34), field, 1)
from table`
_
最初のものは2分、2番目のものは4秒です。
_select convert(varchar(max), field , 1)
from table
_
using varchar(max)
を使用すると、サイズ(種類)を指定する必要はありません。
binaryデータを16進文字列に変換し、再び戻す別の例を示す回答を追加します。
最高のtimestamp
値をvarchar
に変換したい:
SELECT
CONVERT(
varchar(50),
CAST(MAX(timestamp) AS varbinary(8)),
1) AS LastTS
FROM Users
どちらが戻ります:
LastTS
==================
0x000000000086862C
注:varbinary -> varchar
を変換するには、CONVERT
を使用することが重要です。 CAST
を使用しても機能しません。
SELECT
CAST(
CAST(MAX(timestamp) AS varbinary(8))
AS varchar(50) ) AS LastTS
FROM Users
バイナリデータを16進値ではなくcharactersとして扱い、空の文字列を返します。
格納されている16進文字列をタイムスタンプに戻すには:
SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)
注:コードはすべてパブリックドメインにリリースされます。帰属は必要ありません。
SQL Server 2005の「ハッシュバイト」関数から返された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
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'