読者です 読者をやめる 読者になる 読者になる

【SSIS】SSIS覚書-スクリプト関連(3)

記事のフォーマットを他とあわせるついでに全体的に加筆・修正しました。

[2014/06/30追記ここまで]

SSIS覚書シリーズ一覧

前書き

意外と知られていない…と言うかTechNetの奥深くに隠れてるせいで知られていないんですが、スクリプトコンポーネントの出力先は分岐させることができます。

これにより条件分割を再現することができます。と言うわけで、やり方の説明です。

出力先の追加

最初に以下の手順を踏む必要があります。

  1. 「入力および出力」のペインを選択
  2. 「出力の追加(A)」と言うボタンをクリック
  3. 最初からあった出力(デフォルトだと「出力 0」)と追加された出力(デフォルトだと「出力 1」)のExclusionGroupと言うプロパティを同値にする(必ず1以上にすること)
  4. 追加された出力のSynchronousInputIDと言うプロパティを最初からあった出力と同値にする

一応そのあたりの説明はあることはあるんだけど、読んでみればわかる通り、恐ろしくわかりにくいです。

実際に分岐させる

兎にも角にも上記の設定をしてやれば入力0Buffer Rowに新しいメソッドが自動で追加されます。

Row.DirectRowTo出力名()と言うメソッドを呼ぶと出力名に対応した出力へデータが出力されるようになります。

public override void 入力0_ProcessInputRow(入力0Buffer Row)
{
    if (!Row.hoge_IsNull)
    {
        Row.DirectRowTo出力0();
    }
    else
    {
        Row.DirectRowTo出力1();
    }
}

当然、出力を追加したからと言って必ず何かを出力しなきゃいけないわけでもないので、スキップ処理としても使えます。

public override void 入力0_ProcessInputRow(入力0Buffer Row)
{
    if (!Row.hoge_IsNull) Row.DirectRowTo出力0();
}

また、別に分岐させる必要がなければ両方呼ぶことで同じデータを別の出力にコピーできます。(マルチキャストの再現)

public override void 入力0_ProcessInputRow(入力0Buffer Row)
{
    Row.DirectRowTo出力0();
    Row.DirectRowTo出力1();
}

ちなみに、これはできません。出力先を指定する箇所で「値が有効な範囲にありません。」と言う例外が発生します。

あくまでも行単位で出力先を決定する必要があります。

public override void 入力0_ProcessInputRow(入力0Buffer Row)
{
    var count = 0;

    do
    {
        ++count;
    } while (Row.NextRow());

    if (count > n)
    {
        Row.DirectRowTo出力0();
    }
    else
    {
        Row.DirectRowTo出力1();
    }
}

まとめ

まとめるほどの内容はないですが…。覚えておくと非常に便利な機能です。ガンガン活用しましょう。