2

インポート/エクスポートプロセスでは、バイナリデータをBase64でエンコードされた文字列としてXMLに配置します。値を元に戻すときに問題が発生しました...

2005/2008のパフォーマンスはnodes()を使用すると恐ろしいため、OPENXMLを使用しています。これはまったく拡張性がありません。彼らはSQLServer2012のパフォーマンスの問題を修正しましたが、レガシーサポート(2005+)のために、それは現実的なオプションではなく、MSは物事をバックポートしたくないようです(可能な場合でも)。

これが主題に関するいくつかの関連情報です。

理想的には、OPENXMLを使用してBase64にエンコードされたバイナリデータを含むXMLドキュメントを細断処理し、データがバイナリデータとして正しくレンダリングされる結果セットを提供する単一のSQLステートメントを探しています。誰かがもっと良いものを持っていることを期待して、ノードを使用しないソリューションが1つあります。

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 に答える