TSQL でバイナリ値を 16 進数として出力するにはどうすればよいですか?
-
09-06-2019 - |
質問
SQL Server 2000 を使用して、テーブルからいくつかの値を出力しています。 PRINT
. 。ほとんどの非文字列データでは、nvarchar にキャストして出力できますが、バイナリ値は文字のビット表現を使用して変換しようとします。例えば:
DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)
期待される:
0x12345678
代わりに、2 つの意味不明な文字が出力されます。
バイナリデータの値を出力するにはどうすればよいですか?組み込みのものはありますか、それとも独自に開発する必要がありますか?
アップデート:これは行上の唯一の値ではないため、単に @binvalue を PRINT することはできません。PRINT N'other things' + ???? のようなものです。+「もっといろいろ」。それが違いを生むかどうかはわかりません:PRINT @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)
サイズ(のようなもの)を指定することを心配する必要はありません。
別の変換例を示す回答を追加する バイナリ データを 16 進文字列に変換し、再度元に戻します。
最高額に変換したい timestamp
に値を入れる varchar
:
SELECT
CONVERT(
varchar(50),
CAST(MAX(timestamp) AS varbinary(8)),
1) AS LastTS
FROM Users
これは以下を返します:
LastTS
==================
0x000000000086862C
注記:使うことが重要です CONVERT
変換する varbinary -> varchar
. 。使用する CAST
動作しないでしょう:
SELECT
CAST(
CAST(MAX(timestamp) AS varbinary(8))
AS varchar(50) ) AS LastTS
FROM Users
バイナリデータを次のように扱います キャラクター 16 進値ではなく、空の文字列を返します。
逆にする
保存された 16 進文字列をタイムスタンプに変換するには、次のようにします。
SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)
注記:すべてのコードはパブリック ドメインに公開されます。出典は必要ありません。
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'
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