2

对于导入/导出过程,我们将二进制数据作为 Base64 编码字符串放入 XML。取回值时出现了问题...

我们使用 OPENXML 是因为使用nodes()在 2005/2008 年的性能非常糟糕——它根本无法很好地扩展。他们修复了 SQL Server 2012 中的性能问题,但为了遗留支持(2005+),这不是一个现实的选择,而且 MS 似乎不想向后移植一些东西(假设甚至可能)。

这是有关该主题的一些相关信息

理想情况下,我正在寻找使用 OPENXML 的单个 SQL 语句来分解包含编码为 Base64 的二进制数据的 XML 文档,并在那里提供一个结果集,该结果集将数据正确呈现为二进制数据。我有一个不使用节点的解决方案,希望有人有更好的东西。

4

1 回答 1

5

您可以将列指定为 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);
        }
    }
于 2012-08-09T06:43:13.447 回答