2011-04-29 7 views
0

データフロータスクでエラーが発生しました。SSIS:出力バッファから空行を削除

私は、非同期スクリプトコンポーネントに行くado.netソースを持っています。

問題は、それ

が、それは自動的に私のテーブルに出力バッファに入れ、空行を入れしようとした宛先にスクリプトコンポーネントからインサートの一番最後に来ます。

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

答えて

1

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

デフォルトでは、スクリプトコンポーネントは同期型です。入力行ごとに1つの出力行があります。これはあなたが現在セットアップしているものかもしれません。

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

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

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

1

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

0

問題は、SSISがPreExecute中に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(); 
     } 
    } 
} 
関連する問題