10 モデルケース9「列挙されたパラメータでAccessへの転送をループ処理する」

モデルケース8では、ストアドプロシージャ「uspCustomerFilter」に固定的なパラメータを指定して一度実行するだけでした。しかしパラメータを持つということはそれだけ多くのバリエーションで処理されることが多いということです。そこでここでは、パラメータを順次変えながら、「uspCustomerFilter」を連続的に呼び出す方法を説明します。それによって、異なるパラメータで複数条件のレコードを各々取得してAccessにデータ転送することができます。

ストアドプロシージャを連続的に実行したい場合、ひとつの方法としてはモデルケース8におけるデータフロータスクを複数個、パラメータの種類だけ配置し、個々のパラメータ値を直接書き換えていくという方法があります。モデルケース8の場合なら、「OLE DBソース」の「SQLコマンドテキスト」を「EXEC uspCustomerFilter '目黒区', 'ムラ'」・「EXEC uspCustomerFilter '新宿区', 'タナカ'」・「EXEC uspCustomerFilter '千代田区', 'ヤマ'」・・・・・というようにそれぞれ別の内容にします。しかしこの方法では、常に固定された処理ならよいですが、パラメータの内容が変わったり、追加・削除があったりした場合にその変更作業は非常に面倒です。

そのようなときに便利なのが、「ループコンテナ」を利用した処理です。データフロータスクや「uspCustomerFilter」の呼び出しは1回分のみ配置し、それをループで呼び出すことによって連続実行させることができます。また複数種類のパラメータの値をあらかじめ用意しておき、ループが1回実行されるたびに次のパラメータ値を順次代入していくことで、パラメータ値を変えながらループ処理させることができます。

ここでは、「uspCustomerFilter」ストアドプロシージャに与える2つのパラメータを複数個あらかじめパッケージ内に列挙しておき、それにしたがってループ処理させるという手順を説明します。


  1. ソリューションエクスプローラ上で「Case08.dtsx」をコピーして貼り付け、「Case09.dtsx」という名前に変更して開きます。


  2. ツールボックスより、「Foreachループコンテナ」を選択してデザイナ上にドラッグ&ドロップします。




  3. 「SQL実行タスク」から出ている緑色のコネクタをいったん削除したあと、それを「Foreachループコンテナ」へとつなぎ変えます。さらに「データフロータスク」を「Foreachループコンテナ」の中に移動します。


  4. 「Foreachループコンテナ」をダブルクリックして「Foreachループエディタ」ダイアログを開きます。


  5. 画面左のリストより「コレクション」を選択して画面を切り替えます。

  6. 「Enumerator」プロパティの設定を「Foreach Item 列挙子」に変更します。これは“Item列挙子”に登録されたデータをループで順番に取り出して使うという設定です。


  7. 次に、画面中央部の表示内容が切り替わったことを確認して、画面右下の[列]ボタンをクリックします。


  8. 「For Each Item 列」ダイアログが表示されたら、[追加]ボタンを2回クリックして2つの列を追加します。
    この“2つ”とは、パラメータの「@City(市区町村の抽出条件)」と「@LastName(姓のフリガナの抽出条件)」を意味しています。またこの例では必要ありませんが、パラメータのデータ型によっては画面上の「データ型」をそれに合わせて変更します。


  9. [OK]ボタンをクリックしてダイアログを閉じると、エディタ上の「列挙子の構成」欄に2列の表が追加されています。


  10. 次に、この表に複数の具体的なパラメータ値を直接入力して列挙していきます。
    • この表に入力されたデータが実行時に使われるパラメータのリストになりますので、あとで変更になった場合にはこの画面を呼び出して適宜編集を加えることになります。

  11. 次に画面左のリストより「変数のマッピング」を選択します。
    ここから先ほど設定したパラメータの2列それぞれに対して「変数名」を割り当てます。ちょうど表の各列(0と1)に列名を付けるようなイメージです。


  12. 画面中央の表の「変数」欄の[▼]をクリックして「新しい変数」を選択します。


  13. 「変数の追加」ダイアログが表示された、任意の変数名を入力します。今回は必要ありませんが、必要に応じて「値の型」なども指定します。
    なお、列挙子の「列0」には市区町村名が入力されています。ここではその「列0」に対応した名前を付けます。


  14. [OK]ボタンをクリックしてその変数を確定します。

  15. 続けて、同様の操作でもうひとつの列(2つめのパラメータである「列1」)に変数名を割り当てます。






  16. [OK]ボタンをクリックして「Foreachループエディタ」ダイアログを閉じます。

  17. SSISデザイナに戻ったら、「データフロータスク」をダブルクリックして画面を「データフロー」タブに切り替えます。


  18. 「OLE DBソース」コンポーネントをダブルクリックして「OLE DBソースエディタ」ダイアログを開きます。


  19. ここでは、パッケージをコピーしてきたので、「SQLコマンドテキスト」の欄が「EXEC uspCustomerFilter '目黒区', 'ムラ'」となっています。今回パラメータは「目黒区」や「ムラ」に固定ではなく先ほど設定した列挙子に応じて順次変化してきますので、パラメータ値の部分をそれを意味する記号「?」に書き換え、「EXEC uspCustomerFilter ?, ?」とします。




  20. 次に[パラメータ]ボタンをクリックして「クエリパラメータの設定」ダイアログを開きます。


  21. 「変数」欄の[▼]をクリックして、SQLコマンドテキスト内の「?」に対応した2つのパラメータに「Foreachループエディタ」で設定したユーザー変数を割り当てます。




  22. 「パラメータ」の欄がデフォルトで「パラメータ0」「パラメータ1」というようになっていますが、これをストアドプロシージャ上のパラメータ名(@記号付きのもの)に書き換えます。


  23. [OK]ボタンをクリックして「クエリパラメータの設定」ダイアログを閉じます。

  24. [OK]ボタンをクリックして「OLEDBソースエディタ」ダイアログを閉じます。

  25. 今回は既存のパッケージをコピーして流用していますが、新規に作成した場合などはOLE DB変換先等その他の設定を行います。

  26. 最後にパッケージを実行してみます。
        
    ●実行後のAccess側のテーブルの内容
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved