SQL Server十六进制字符串到varbinary转换

时间:2013-01-03 19:36:03

标签: sql-server string hex varbinary

好的,问题是需要在2个表上进行合并或连接。一个文件内容存储为[image]类型或varbinary(max),另一个文件内容存储为十六进制字符串。如果我将相同的内容上传到两个表中

作为字符串的内容(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

似乎转换是在目标上但在每个之间放置两个零(00),因为缺少更好的单词,我会称之为字节。

我尝试过跨论坛发布的各种更复杂的方法,但无济于事。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:23)

来自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

答案 1 :(得分:4)

好的,所以填充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可以正常工作,但我的目标SQL Server是2005年。