これを行う 1 つの方法を次に示します。この例では、SQL Server 2012 バックエンドで SSIS 2008 R2 を使用しています。
パラメータ値を格納するテーブルを作成します。テーブル名がdbo.SProcValuesだとしましょう。ストアド プロシージャの定義に基づいて、テーブル スキーマは次のようになります。
CREATE TABLE dbo.SProcValues(
Id int IDENTITY(1,1) NOT NULL,
SProcName nvarchar(40) NOT NULL,
SchemaName nvarchar(20) NOT NULL,
Dimension nvarchar(40) NOT NULL,
ETLSchema nvarchar(20) NOT NULL,
ETLTable nvarchar(40) NOT NULL,
IsExecute bit NOT NULL
)
GO
次のスクリプトを使用してサンプル データを挿入してみましょう。
INSERT INTO dbo.SProcValues
(SProcName, SchemaName, Dimension, ETLSchema, ETLTable, IsExecute) VALUES
('dbo.sp_generate_merge', 'dim1', 'dimension1', 'stg1', 'table1', 1),
('dbo.sp_generate_merge_scdbk', 'dim2', 'dimension2', 'stg2', 'table2', 1),
('dbo.sp_generate_merge_scdbk', 'dim3', 'dimension3', 'stg3', 'table3', 0),
('dbo.sp_generate_merge', 'dim4', 'dimension4', 'stg4', 'table4', 0);
GO
SSIS パッケージでは、データ ソースと接続マネージャーが既に確立されていることを前提としています。次の変数を作成します。変数SProcValuesは、上記のテーブルに格納したパラメーター セットを保持します。変数SQLInnerQueryは、後で内部 SQL 実行タスクで使用されるクエリを保持します。他の変数は、テーブルで使用可能な各列に関連しているため、各行をループして変数に保持できます。
次のクエリを変数SQLGetParametersの値に貼り付けます。
SELECT SProcName, SchemaName, Dimension, ETLSchema, ETLTable, IsExecute FROM dbo.SProcValues
変数SQLInnerQueryを選択し、F4 を押してプロパティを表示します。プロパティEvaluateAsExpressionをTrueに設定し、 Expressionプロパティに対して省略記号ボタンをクリックします。
後で内部 SQL 実行タスクに提供できる、EXEC ストアド プロシージャ ステートメントに評価される式を設定する必要があります。次の式を設定します。
"EXEC " + @[User::SProcName] + " @Schema = ?, @Dimension = ?, @ETLSchema = ?, @ETLTable = ?, @IsExecute = ?"
エディタの Evaluate Expression ボタンをクリックすると、式が何に評価されるかを見ることができます。また、パッケージ変数 SProcName に現在値がないため、以下のスクリーンショットにストアド プロシージャ名がないことにも気付くでしょう。実行時に、SProcName にはテーブルの値が割り当てられ、この式は自動的に解決されます。
SSIS パッケージで、SQL 実行タスクをドラッグ アンド ドロップします。このタスクは、次のクエリを実行して、テーブル dbo.SProcValues に格納されているパラメーター値のリストをフェッチします。以下に示すように、SQL 実行タスクの [全般] ページを構成します。この例では OLEDB 接続を使用し、接続マネージャー/データ ソースには Practice という名前が付けられています。
クエリからの結果セットをオブジェクト変数に格納するように、SQL 実行タスクの [結果セット] ページを構成します。
ストアド プロシージャに渡す必要があるパラメーター値のリストを取得するように最初の SQL 実行タスクを構成したので、レコードをループ処理する必要があります。
Foreach ループ コンテナーをドラッグ アンド ドロップします。SQL 実行タスクの優先順位コンテナーを Foreach ループ コンテナーに接続します。以下に示すように、Foreach ループ コンテナーの [コレクション] ページを構成します。ADO 列挙子を使用して、結果セットをループしています。
以下に示すように、Foreach ループ コンテナーの変数マッピング ページを構成します。各行をループすると、列の値がそれぞれの変数に格納されるため、次の SQL 実行タスクに渡してストアド プロシージャを実行できます。
Foreach ループ コンテナー内に Execute SQL Task をドラッグ アンド ドロップして、結果セット内の行をループするたびにこのタスクが実行されるようにします。以下に示すように、SQL 実行タスクを構成します。
ノート
要件に応じて、この 2 番目の SQL 実行タスクでResultSetプロパティを構成することができます。ResultSet を選択した場合は、結果セットを受け入れるように適切なオブジェクト変数を構成する必要があります。この例では、 Noneのままにしました。
パラメータとしてストアド プロシージャに渡される値を設定します。
最終的に、制御フローは次のようになります。
パッケージが実行されると、テーブル行で定義されたすべてのストアド プロシージャがデータベースで利用可能である場合、上記の SELECT クエリによって返されるレコードの数だけ、ループによってストアド プロシージャが実行されます。ストアド プロシージャdbo.sp_generate_merge_scdbk
を作成dbo.sp_generate_merge
し、同じパラメーター定義を使用しました。これが、パッケージが正常に実行された理由です。