OPENXML,将 Base64 转换为二进制

OMG*_*ies 2 sql t-sql sql-server sql-server-2005

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

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

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

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

Mik*_*son 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
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 CLR(如果这是您的选择),如下所示:

using System;
using System.Text;
    public class CLRTest
    {
        public static byte[] ConvertBase64ToBinary(string str)
        {
            if (str == null)
            {
                return null;
            }
            return Convert.FromBase64String(str);
        }
    }
Run Code Online (Sandbox Code Playgroud)