4

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

作为字符串的内容(字节数组到字符串)看起来像这样......

'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),由于缺少更好的词,我将其称为一个字节。

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

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 或与.NVARCHARVARCHAR

因此,由于存储的数据在 中nvarchar(max),因此解决方案是:

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

我确信这convert也可以,但我的目标 SQL Server 是 2005。

于 2013-01-04T16:43:19.283 回答