对于导入/导出过程,我们将二进制数据作为Base64编码的字符串放入XML中。在重新获得价值时,问题出现了......
我们正在使用OPENXML,因为使用nodes()时,2005/2008年的表现很糟糕 - 它根本不能很好地扩展。他们修复了SQL Server 2012中的性能问题,但是为了传统支持(2005+),这不是一个现实的选择,并且MS似乎不希望向后端移动(假设甚至可能)。
这里有一些relevant info on the subject。
理想情况下,我正在寻找一个单独的SQL语句,使用OPENXML来粉碎包含编码到Base64的二进制数据的XML文档,并提供一个数据正确呈现为二进制数据的结果集。我有一个不使用节点的解决方案,希望有人有更好的东西。
答案 0 :(得分:4)
您可以将列指定为XML,并使用.value
将数据设为varbinary
。
像这样。
declare @XML xml
set @XML =
'<root>
<item>
<ID>1</ID>
<Col>Um93MQ==</Col>
</item>
<item>
<ID>2</ID>
<Col>Um93Mg==</Col>
</item>
</root>'
declare @idoc int
exec sp_xml_preparedocument @idoc out, @xml
select T.ID,
T.Col.value('.', 'varbinary(max)')
from openxml(@idoc, '/root/item', 2)
with (ID int,
Col xml) as T
exec sp_xml_removedocument @idoc
或者您可以使用CLR(如果这是一个选项),如下所示:
using System;
using System.Text;
public class CLRTest
{
public static byte[] ConvertBase64ToBinary(string str)
{
if (str == null)
{
return null;
}
return Convert.FromBase64String(str);
}
}