2012-08-09 115 views
2

对于导入/导出过程,我们将二进制数据作为Base64编码的字符串放入XML中。这个问题出现时得到的价值退出...OPENXML,将Base64转换为二进制

我们使用OPENXML因为2005/2008年的表现是可怕的使用nodes() - 它不能很好地扩展。他们修复了SQL Server 2012中的性能问题,但出于遗留支持(2005+)的考虑,这不是一个现实的选择,而且MS似乎也不想回溯(假设甚至可能)。

这里是一些relevant info on the subject

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

回答

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); 
     } 
    } 
+0

THX - 比我的'CAST(N '')更好的价值(“XS :base64Binary(sql:列('Col'),'VARBINARY(MAX)')' – 2012-08-11 02:57:24