0

データ フロー タスクでエラーが発生しました。

非同期スクリプト コンポーネントに向かう ado.net ソースがあります。

問題は、スクリプト コンポーネントから挿入先への挿入の最後で発生します。

テーブルの出力バッファに自動的に配置される空の行を配置しようとします。

これが起こらないようにする方法はありますか/出力バッファを操作して特定の行を削除するにはどうすればよいですか?

4

3 に答える 3

1

あなたは、ソースが非同期スクリプト コンポーネントに行くと言います。これが true の場合、行がいつ出力バッファーに移動するかを既に制御しています。

デフォルトでは、スクリプト コンポーネントは同期的です。入力行ごとに 1 つの出力行があります。多分これはあなたが現在設定しているものです。

スクリプト コンポーネントを非同期コンポーネントとして使用する場合は、次の操作を行う必要があります。

  • 新しいスクリプト コンポーネントを追加する
  • コンポーネントを右クリックし、[高度なエディターを表示...] を選択します。
  • [入力および出力のプロパティ] で [出力] 項目を選択し、SynchronousInputID の値を [なし] に変更します。
  • [出力] タブで、出力バッファーを定義する列を追加します。同期スクリプトとは異なり、出力バッファーは入力バッファーに一致するものとして自動的に定義されないため、列を定義する必要があります。

スクリプトを編集する場合、OutputBuffer.AddRow メソッドを使用して、出力バッファーに新しい行を作成できます。AddRow を呼び出すたびに、既存のバッファーの内容がスクリプト コンポーネントから送信され、次の行のためにクリアされます。行をスキップするルールを使用して、行を追加またはスキップする前に入力バッファーを検証します。

于 2011-05-02T14:14:01.877 に答える
1

この問題を解決するために、条件分割コンポーネントを追加し、空白列の 1 つに長さチェックを追加しました (つまり、len([testfield])>0)。次に、そのチェックでそれらのフィールドをデータベースに送信し、他のブランチには何もしませんでした。

于 2012-05-04T17:08:13.473 に答える
0

問題は、PreExecute 中に SSIS が AddRow() 関数を実行しているようです。public override void ProcessInputRow()これは、関数での AddRow() の使用と衝突する傾向があります。たとえば、PreExecute が新しい行を作成して開始し、処理の一部として新しい行を手動で作成すると、2 つの新しい行ができ、最初の行は NULLS でいっぱいで、既に出力バッファに渡されています。これを修正するには、必要に応じて行を追加するだけでなく、オーバーライドCreateNewOutputRows()して空のままにします。たとえば、正しいデータが入力バッファーに表示されない場合、一部の非同期スクリプトは出力バッファーに行をまったく追加しません。

public class ScriptMain : UserComponent {

    public override void CreateNewOutputRows() {}

    public override void Input_ProcessInputRow(InputBuffer Row) {
       if(asNeeded) {
          OutputBuffer.AddRow();
       }
    }
}
于 2015-03-05T00:14:57.307 に答える