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>
申し訳ありませんが、私はそう、私は近づいて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 –