2016-07-28 4 views
0

XML形式のデータを構築するSQL文(SQL Server 2014)があります。私はSSIS(2013)オブジェクト変数にこれを引き出しています。 SQLをデータ・フロー・タスクに入れてテキスト・ファイルに入れると、それは機能します。ただし、エンコーディングヘッダーはありません。返されるデータのサイズのため、NVARCHARへの変換はオプションではありません。データは途切れてしまいます。変数オブジェクトLoadXmlからXMLを読み取るためのSSISスクリプトタスクの使用

代わりに、私は同じSQLクエリーを持っています。 ResultSet = XML;変数のデータ型=オブジェクト(文字列にしようとすると失敗します)

ここでは多分、XmlWriterとXmlWriterSettingsを使用するのに大変なことがありました。素晴らしい、素晴らしい。しかし、私はスクリプトタスク(C#)にXMLオブジェクトを正しく読み込み(またはフォーマット/定義する)ようには思えません。私は "DTSスクリプトタスクでユーザーコードに例外が発生しました"というメッセージが表示され続けます。

変数にXMLデータがあることを確認した折り返し点を設定しました。デバッグモードでは、特定のエラーは "ルートレベルのデータは無効です。行1、位置1"です。

LoadXMLステートメントで例外がスローされます。何が欠けていますか? XMLレイアウト(フィールド)を定義する必要はありますか?コメントアウトされたテスト文字列はw/o問題なしで動作します。失敗しない。ヘッダーが書き込まれます。

アイデア?

更新:ルートタグのないテストデータの文字列バージョンでも失敗します。

public void Main() 
     { 

      Variables varCollection = null; 
      Dts.VariableDispenser.LockForWrite("User::PCC_XML"); 
      Dts.VariableDispenser.GetVariables(ref varCollection); 

      XmlDocument xdoc = new XmlDocument(); 

      XmlWriterSettings settings = new XmlWriterSettings 
      { 
       Encoding = Encoding.UTF8, 
       ConformanceLevel = ConformanceLevel.Document, 
       OmitXmlDeclaration = false, 
       CloseOutput = true, 
       Indent = true, 
       IndentChars = " ", 
       NewLineHandling = NewLineHandling.Replace 
      };  

      xdoc.LoadXml(varCollection["User::PCC_XML"].Value.ToString()); 

      //xdoc.LoadXml("<xml><foo></foo></xml>"); 

      using (StreamWriter sw = File.CreateText("C:\\test_xml.xml")) 
      using (XmlWriter writer = XmlWriter.Create(sw, settings)) 
      { 
       xdoc.WriteContentTo(writer); 
       writer.Close(); 
      }  

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 

私のXMLのダウンskinniedバージョンは、(追加しまっROOTを含む)である

<ROOT> 
    <Universal_letters> 
     <Universal_letter> 
      <docID>123456</docID> 
      <Letter_Code>123</Letter_Code> 
      <Callback_Phone>1-888-111-111</Callback_Phone> 
      <Delivery_Methods> 
       <Delivery_Method /> 
       <Print_Queue /> 
      </Delivery_Methods> 
      <Requested_Date>2016-07-28</Requested_Date> 
      <Consumer_First_Name>Bubba</Consumer_First_Name> 
      <Consumer_Last_Name>Bubbster</Consumer_Last_Name> 
      <Consumer_Address_1>123 Street Way</Consumer_Address_1> 
     </Universal_letter> 
    </Universal_letters> 
</ROOT> 
+0

申し訳ありませんが、私はそう、私は近づいてXMLを過度に慣れていませんよこれはSQLですが。以下は、データを4000文字の出力に分解するTSQLの一部です。このロジックを利用すると、ssisパッケージの制御フローのループでこれを行うことができます。あるいは、C#で同様のことをすることができます。 \t 申し訳ありませんが、これはコメントとしてはあまり読み込めません。 \t declare @v varchar(max)= '' 宣言@c int; set @count = len(@v)/ 4000 if(len(@v)%4000> 0)@c = @c + 1 を宣言する@i int = @c while(@count> 0) 部分文字列(@ v、0 +(4000 *(@ i- @ c))、4000+(4000 *(@i- @ c))) @c = @c - 1 end –

答えて

0

あなたはXML要素や特殊文字のチェックの間隔を削除しようとしています。あなたのXMLは問題なく、スクリプトタスクのC#コードもその仕事をしています。 クエリで説明したのと同じシナリオを再作成しました。 だから、問題は実際に実行時に生成され、PCC_XML変数への入力として設定されている実際のXMLにあると思います。変数に書かれているかもしれない方法で、何か怪しいものがあるかもしれません。いくつかのスペーシングや特殊文字があると、同じことが起こることがあります。 お手伝いがあれば、それに答えて印をつけてください。

0

Mohdが提案したように私のXMLサンプルを動作させることができませんでした。しかし、今日、私はこれを見つけましたhttp://www.sql-server-performance.com/2013/export-to-xml-using-ssis/(結果セットとして文字列を使用し、&をXMLにエクスポートするスクリプトタスク) https://stackoverflow.com/a/14840090/4509043と組み合わせて、エンコーディングを行いました。私が必要とされた場所に私を入れました。

興味深いことに、C#スクリプトタスクは、NVARCHAR(MAX)と異なり、大きなXMLデータを切り捨てることはありませんでした。それは素晴らしいです!また、OLE DB接続が機能しないこと、ADO.NETでなければならないことにも言及する価値があります。

最終的な解決策: ユーザー:: PCC_XMLは文字列データ型です。 SQLタスクには、単一行の結果(XMLタイプ)があります。

私の最後の - 作業C#のコードは次のとおりです。名前空間宣言の前に

- 他のネームスペース

using System.Xml; //added - for xml 
using System.Text; //added - for Encoding 
using System.IO; // added - for file writing 

メインPROCと

public void Main() 
     { 

      XmlDocument xdoc = new XmlDocument(); 

      // will ensure that XML exported will have opening tag 
      // <?xml version="1.0" encoding="UTF-8"?> 
      XmlWriterSettings settings = new XmlWriterSettings 
      { 
       Encoding = Encoding.UTF8, 
       ConformanceLevel = ConformanceLevel.Document, 
       OmitXmlDeclaration = false, 
       CloseOutput = true, 
       Indent = true, 
       IndentChars = " ", 
       NewLineHandling = NewLineHandling.Replace 
      }; 

      // strip out the <root> </root> tags on insert into string 
      string strXML = Dts.Variables["User::PCC_XML"].Value.ToString().Replace("<ROOT>", "").Replace("</ROOT>", ""); 

      xdoc.LoadXml(strXML.ToString()); 

      // test destination 
      using (StreamWriter sw = File.CreateText("C:\\test_xml.xml")) 
      using (XmlWriter writer = XmlWriter.Create(sw, settings)) 
      { 
       xdoc.WriteContentTo(writer); 
       writer.Close(); 
      } 

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 
関連する問題