2012-08-09 102 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