3

処理する必要のあるすべてのデータを処理するdtsxパッケージ内にデータフローがあります。最後に、いくつかのクリーンアップタスクを実行する必要があります。たとえば、次の構造を想定します。

やりたいこと

3つのケースすべてでレコードが真の場合、3つすべてのOLEDBコマンドを実行します。レコードがケース1のみに当てはまる場合は、ケース1のみを実行する必要があります。

マルチキャストと3つの個別の条件付き分割(以下のとおり)を使用してこれを行うことができましたが、よりクリーンな方法を望んでいました。何か案は?

可能な代替案。 もっと良い方法はありますか?

4

2 に答える 2

7

マルチキャストと3つの条件付き分割を使用するのが最も簡単で、おそらく最も理解しやすいでしょう。

3つの出力を持つトランスフォーメーションとしてセットアップされたスクリプトコンポーネントは、おそらく次に実装が簡単ですが、一連のセットアップとある程度のコーディングが必要になります。データフローは比較的きれいに見えます。

ここに画像の説明を入力してください

出力ごとに、必ずにを設定しSynchronous Input IDNoneください(行がいつ作成されるかを制御できるようにするため)。次に、各出力の各入力列を複製する必要があります。スクリプトコード自体は次のようになります。

public override void IncomingRows_ProcessInputRow(IncomingRowsBuffer Row)
{
    if (Case1Logic(Row))
    {
        Case1OutputBuffer.AddRow();
        Case1OutputBuffer.ProductId = Row.ProductID;
        Case1OutputBuffer.Name = Row.Name;
        // etc. for all columns
    }
    if (Case2Logic(Row))
    {
        Case2OutputBuffer.AddRow();
        Case2OutputBuffer.ProductId = Row.ProductID;
        Case2OutputBuffer.Name = Row.Name;
        // etc. for all columns
    }
    if (Case3Logic(Row))
    {
        Case3OutputBuffer.AddRow();
        Case3OutputBuffer.ProductId = Row.ProductID;
        Case3OutputBuffer.Name = Row.Name;
        // etc. for all columns
    }
}

private bool Case1Logic(IncomingRowsBuffer Row)
{
    // Whatever the Case 1 logic involves
}
private bool Case2Logic(IncomingRowsBuffer Row)
{
    // Whatever the Case 2 logic involves
}
private bool Case3Logic(IncomingRowsBuffer Row)
{
    // Whatever the Case 3 logic involves
} 

人々が列を変更したいと思ったときに、これを最新の状態に保つのを楽しんでください!

それがあなたにとって十分に毛深いものでないなら、あなたはあなた自身のカスタム変換を書くことができます。それを行う方法の厄介な詳細はMSDNにあります; 関係するコードはもっとたくさんあると言えば十分です。また、SSISがバッファ管理を処理する方法について、これまでに知りたかった以上のことを学びます。これにより、すぐに使用できる条件付き分割で同じ行を複数の出力に送信できない理由が説明される場合があります。

最後に、メンテナンスの悪夢でもある本当に見苦しいソリューションが必要な場合は、ケースの組み合わせごとに1つの出力を持つ条件付き分割を作成してみてください。ユニオンオールトランスフォーメーションを各OLE宛先の前に配置します。Cases 1, 2 and 3出力を3ウェイマルチキャストに転送し、1つのマルチキャスト出力を3つのUnionAll変換のそれぞれに送信します。条件付き分割のCases 1 and 2、、Cases 2 and 3およびCases 1 and 3出力は、それぞれ双方向マルチキャスト変換に送られ(これにより、適切なUnion Allにフィードされます)、、、Case 1およびCase 2出力Case 3は、適切なUnionAllに直接送られます。次のようになります。

ここに画像の説明を入力してください

要約すると、あなたのオリジナルのアイデアは最も単純で、おそらく最高だと思います。

于 2013-03-08T04:25:11.067 に答える
1

C#またはVBにどれだけ慣れているかに応じて、基本的にマルチキャストと条件付き分割を1つにした独自の変換を作成できます。スクリプトコンポーネントをデータフローに追加すると、それがソース、変換、または宛先のいずれであるかを尋ねられます。変換を選択し、入力と3つの出力を追加して、そこから移動します。幸運を!

于 2013-03-08T03:27:01.143 に答える