2013-01-03 64 views
0

好的,问题是有一个合并或连接需要在2个表上完成。一个将文件内容存储为[image]类型或varbinary(最大),另一个将文件内容存储为十六进制字符串。如果我上传同样的内容到这两个表SQL Server十六进制字符串到varbinary转换

内容为字符串(ByteArray的字符串)看起来就像这样......

'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

看起来好像转换在T但在每个之间放置两个零(00),我会称它为缺少更好单词的字节。

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

+0

在你例如另一个表包含base64编码,而不是十六进制字符串。这个例子是你打算作为输出接收还是实际的源格式? –

回答

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

+0

或将存储类型更改为'varchar'而不是'nvarchar' – GoldBishop

14

MSDN

在SQL Server 2008中,将这些转换更容易,因为我们 直接在CONVERT内置功能增加了支持。代码 下面示例说明如何执行转换(S):

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 
+0

的@hexstring看起来像这样: ' '应用/ vnd.xfdl;内容编码= “的base64 gzip的” H4sIAAAAAAAAC + y9e1fjONI4/H9/Cg173idwFgIJl + 5m6MzPJAayE + KsnXQPs8 + cHJMY8HZi57ET' ...' 目标二值=' 0x670706C69636174696F6E' 'select CONVERT(varbinary(max),@hexstring);' - 成功,但错误的二进制0x6100700070006C00690063006100740069006F006E 'select CONVERT(varbinary(max),@hexstring,1);' - failed“将数据类型nvarchar varbinary“ 'select CONVERT(varbinary(max),@hexstring,2);' - 失败”将数据类型nvarchar转换为varbinary时出错“ –

+0

我测试了几乎所有我可以在线找到的东西,例如”From MSDN“type posts。剩下的问题是,为什么泛型CONVERT(varbinary(MAX),@hexstring)每2个字符填充00,并且有办法摆脱它? –

相关问题