1

私は次のことができるようにしたい:

  • 行ごとにフラットファイルをインポートする
  • 各行の列値で条件付き分割を行う
  • 有効な値を検出した場合、この行を続行したい
  • いずれにせよ、不可能な値を検出した場合、コンポーネントを FAIL にしたいので、ワークフローが停止し、エラーが発生します

例: 3 つの列 (「タイプ」、「値」、「メッセージ」) を持つファイルがあります。

フラットファイルの宛先を使用して、そのファイルを行ごとにインポートしたいと考えています。次に、条件付き分割を行います。「タイプ」列の値が「1」の場合、その行を宛先に書き込みたいです。タイプが「2」または「3」の場合、それらを無視します。ただし、「A」または「0」の場合、コンポーネントを失敗させたいと思います。

「FAIL」の部分以外はすべて揃っています。最後の条件 (「列は 1、2、または 3 ではありません」) の出力を「コンポーネントの失敗」として構成しましたが、実際にはコンポーネントが失敗するわけではありません。

4

2 に答える 2

7

スクリプト コンポーネントをデータ フローに (宛先として) 追加し、パッケージを強制的に失敗させる条件の条件付き分割にリンクします。

スクリプトコンポーネント内に追加

    bool pbCancel = false;
    this.ComponentMetaData.FireError(100, "Script Component", "Data Error <type message here>", "", 0, out pbCancel);

スクリプト コンポーネント自体は成功しますが、データ フロー タスクは失敗し、パッケージ エラーが発生するはずです。

于 2011-08-16T13:35:18.263 に答える
0

しばらく探して、ついに一人で見つけたものを追加します...

ダリルが言ったように、ComponentMetaData.FireError()メソッドをそのまま使用すると、実行結果にエラーが表示されますが、スクリプト コンポーネントは失敗しません。データ フロー タスクは失敗しますが、ジョブを実行した後 (おそらく、INSERT や UPDATE の後) にのみ失敗します。データ フローの実行を完全に停止するには、次のようにします。

  • 2 つの出力を使用して、失敗条件で 条件分岐を作成します。
    1. ラインOK
    2. 条件を満たさない行
  • 2 番目の出力で、各行に明確なメッセージを表示してエラーを発生させるスクリプトを実行します。スクリプト コンポーネントは、出力を得るために、宛先ではなく変換である必要があります。
  • スクリプト コンポーネントの後に、宛先ベースで SQL エラーを発生させる OLE DB コマンドを追加します。RAISERROR(N'At least one line not configured have been found',16,1)
  • 最後に、OLE DB コマンドの後で、Union Allコンポーネントを使用して、条件付き分割 (行 OK) の最初の出力を OLE DB コマンドの出力と結合します。

このようにして、条件を満たさない行ごとにエラーを発生させ、少なくとも 1 つのエラーが発生した場合にレコードを挿入する前にデータ フロー タスクを停止することができます。

于 2016-06-06T14:11:48.910 に答える