4

問題は、2つのテーブルで実行する必要のあるマージまたは結合があることです。1つは[image]タイプまたはvarbinary(max)として保存されたファイルの内容を持ち、もう1つは16進文字列として保存されたファイルの内容を持ちます。同じコンテンツを両方のテーブルにアップロードした場合

文字列としてのコンテンツ(bytearrayからstring)は次のようになります...

'application/vnd.xfdl;content-encoding="base64-gzip"
H4sIAAAAAAAAC+y9e1fjONI4/H9/Cg173idwFgIJl+5m6MzPJAayE+KsnXQPs8+cHJMY8HZi57ET
aObMh3918UW2Jcdyrmbg7E7HtqpUpSqVSqWSdPHLj/EIPBuOa9rWl51K+WgHGNbAHprW45edpqYc
fPp0+vmgsvNL7cPFb1eNFoDlLffLztN0Ojk/PHx5eSl3Zo4hDx+N8sAeH6Iyh2fl0x1S8Hwwc6f2'    
...

画像としてのコンテンツは次のようになります(そしてこれが最終的に私が望むものです)

0x6170706C69636174696F6E

私が選択した場合、私はconvert(varbinary(MAX), @contentAsString)得る0x6100700070006C00690063006100740069006F006E

変換は目標どおりであるように見えますが、それぞれの間に2つのゼロ(00)を入れて、より適切な単語がないため、これを1バイトと呼びます。

私はフォーラム全体に投稿されたあらゆる種類のより複雑な方法を試しましたが、役に立ちませんでした。どんな助けでもいただければ幸いです。

4

2 に答える 2

31

MSDNから

SQL Server 2008では、CONVERT組み込み関数に直接サポートが追加されたため、これらの変換はさらに簡単になりました。以下のコードサンプルは、変換を実行する方法を示しています。

declare @hexstring varchar(max);

set @hexstring = '0xabcedf012439';

select CONVERT(varbinary(max), @hexstring, 1);

set @hexstring = 'abcedf012439';

select CONVERT(varbinary(max), @hexstring, 2);

go

declare @hexbin varbinary(max);

set @hexbin = 0xabcedf012439;

select
   CONVERT(varchar(max), @hexbin, 1),
   CONVERT(varchar(max), @hexbin, 2);

go
于 2013-01-03T21:04:30.963 に答える
5

さて、パディングされた00が答えられました。

DECLARE @hexStringNVar nvarchar(max)
DECLARE @hexStringVAR varchar(max)

SET @hexStringNVar = '{my hex string as described above}'
SET @hexStringVAR = '{my hex string as described above}'

select CONVERT(varbinary(MAX), @hexStringNVar)) = 0x6100700070006C00690063...
select CONVERT(varbinary(MAX), @hexStringVAR)) = 0x6170706C6963...

00パディングはUnicodeによるものであるか、またはではありNVARCHARませんVARCHAR

したがって、保存されたデータはにあるnvarchar(max)ので、解決策は次のようになります。

select CAST(cast(@hexStringNVar as varchar(max)) as varbinary(max)) = 0x6170706C6963...

それも同じように機能すると確信してconvertいますが、私のターゲットSQLServerは2005です。

于 2013-01-04T16:43:19.283 に答える