OPENXML,将Base64转换为二进制

时间:2012-08-09 04:18:29

标签: sql sql-server tsql sql-server-2005

对于导入/导出过程,我们将二进制数据作为Base64编码的字符串放入XML中。在重新获得价值时,问题出现了......

我们正在使用OPENXML,因为使用nodes()时,2005/2008年的表现很糟糕 - 它根本不能很好地扩展。他们修复了SQL Server 2012中的性能问题,但是为了传统支持(2005+),这不是一个现实的选择,并且MS似乎不希望向后端移动(假设甚至可能)。

这里有一些relevant info on the subject

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

1 个答案:

答案 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);
        }
    }