0

入力: 私の入力ファイルは XML ファイルです。これらは、SSIS の foreach ファイル列挙子によって読み取られます。

プロセス: SSIS スクリプト コンポーネント (C#) は、変数からファイル名を読み取ります。XML を必要な形式に変換するための XSL ファイルを作成しました。スクリプト タスクは XSL ファイルを使用し、XML ファイルを (テキストに) 変換します。

使用したコードは次のとおりです。

public override void CreateNewOutputRows()
{
    XslCompiledTransform transformer = new XslCompiledTransform();
    transformer.Load(_xsltFile);
    transformer.Transform(_fileName, @"C:\macro3\outputTestFile.txt");
}

問題:

予想どおり、これにより、変換されたテキスト コンテンツが前述の出力ファイルに書き込まれます。各行を読み込んで処理し、データベースにロードしたい。

さて、ファイルへの書き込み、再度の読み取りはオーバーヘッドです。

変換されたコンテンツを任意のオブジェクトに読み取り、それを (実際にファイルに書き込むことなく) 反復処理する方法はありますか? ストリームか何かのように?

または:

SSIS "XML Task"には "Operation Type = XSLT" 機能がありますが、"SourceType" が変数で、変数にパスを含むファイル名を指定すると、XML を読み取れません。変数内の XML コンテンツが必要です。回避策はありますか?

コメントで具体的な詳細を尋ねてください。それに応じて更新できます。ありがとうございました。

イメージに示すように、XML タスクの式を編集できませんここに画像の説明を入力

4

2 に答える 2

1

スクリプト タスクを使用する代わりに、データ フローを使用します。データ フローは、メモリ内のデータ ストリームを変換するためのものなので、まさに求めているものと同じように聞こえます。

いくつかのオプション:

  1. 必要な変換がそれほど複雑でない場合は、XML ソースを設定し、式を使用して、ソースがファイル パス変数を接続文字列として使用するようにすることができます。それが完了したら、変換を実行するために必要なコンポーネントをさらに追加してから、データベースの宛先を追加できます。
  2. 変換がより複雑で、XSL を使用する場合は、スクリプト コンポーネントをデータ フローのソースとして使用し、XML と XSD を取得して変換を実行するコードを使用できます。変換を実行し、データの行をファイルではなくメモリに取得する例を次に示します。MSDN には、利用可能なすべてのオーバーロードが一覧表示されていますが、それが最適な方向でない場合は、. 次に、結果の行を出力としてデータ フローの残りの部分に渡し、そこからデータベースの宛先コンポーネントに直接移動できます。

いずれにせよ、速度を上げるために宛先を「高速読み込み」に設定してください。


これを完全にデータ フローで行う場合は必要ありませんが、XML タスクに関する限り、Variableの代わりにFile 接続をソースとして使用する必要があります。MSDN では、Variable は XML コンテンツを保持する変数でのみ使用されることに注意してくださいファイル source の場合と同じ方法で式を設定し、ファイル パス変数を渡す必要があります。

于 2015-08-03T18:57:09.473 に答える