2

SQL 実行タスクを使用して SQL SSIS を介して実行されるストアド プロシージャがあります。

タスクには次のものがあります。

USE [OPPY_DWUSD]
GO
DECLARE @return_value int
EXEC    @return_value = [dbo].[generate_merge_scdbk]
    @Schema = N'dim',
    @Dimension = N'VARIETY',
    @ETLSchema = N'stg',
    @ETLTable = N'vw_VARIETY',
    @Execute = 1

SELECT  'Return Value' = @return_value
GO

現在、このセットアップの方法では、同じコードで値が異なる複数の SQL 実行タスクがあり、約 20 の SQL 実行タスクがあります。

これをやってのけるよりクリーンな方法はありますか?

4

2 に答える 2

6

これを行う 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 を押してプロパティを表示します。プロパティEvaluateAsExpressionTrueに設定し、 Expressionプロパティに対して省略記号ボタンをクリックします。

SQLInnerQuery

後で内部 SQL 実行タスクに提供できる、EXEC ストアド プロシージャ ステートメントに評価される式を設定する必要があります。次の式を設定します。

"EXEC " + @[User::SProcName] + " @Schema = ?, @Dimension = ?, @ETLSchema = ?, @ETLTable = ?, @IsExecute = ?"

エディタの Evaluate Expression ボタンをクリックすると、式が何に評価されるかを見ることができます。また、パッケージ変数 SProcName に現在値がないため、以下のスクリーンショットにストアド プロシージャ名がないことにも気付くでしょう。実行時に、SProcName にはテーブルの値が割り当てられ、この式は自動的に解決されます。 表現

SSIS パッケージで、SQL 実行タスクをドラッグ アンド ドロップします。このタスクは、次のクエリを実行して、テーブル dbo.SProcValues に格納されているパラメーター値のリストをフェッチします。以下に示すように、SQL 実行タスクの [全般] ページを構成します。この例では OLEDB 接続を使用し、接続マネージャー/データ ソースには Practice という名前が付けられています。

最初の SQL 実行タスク - 一般

クエリからの結果セットをオブジェクト変数に格納するように、SQL 実行タスクの [結果セット] ページを構成します。

最初の SQL タスクの実行 - 結果セット

ストアド プロシージャに渡す必要があるパラメーター値のリストを取得するように最初の SQL 実行タスクを構成したので、レコードをループ処理する必要があります。

Foreach ループ コンテナーをドラッグ アンド ドロップします。SQL 実行タスクの優先順位コンテナーを Foreach ループ コンテナーに接続します。以下に示すように、Foreach ループ コンテナーの [コレクション] ページを構成します。ADO 列挙子を使用して、結果セットをループしています。

Foreach ループ - コレクション

以下に示すように、Foreach ループ コンテナーの変数マッピング ページを構成します。各行をループすると、列の値がそれぞれの変数に格納されるため、次の SQL 実行タスクに渡してストアド プロシージャを実行できます。

Foreach ループ - 変数のマッピング

Foreach ループ コンテナー内に Execute SQL Task をドラッグ アンド ドロップして、結果セット内の行をループするたびにこのタスクが実行されるようにします。以下に示すように、SQL 実行タスクを構成します。

ノート

要件に応じて、この 2 番目の SQL 実行タスクでResultSetプロパティを構成することができます。ResultSet を選択した場合は、結果セットを受け入れるように適切なオブジェクト変数を構成する必要があります。この例では、 Noneのままにしました。

2 番目の SQL 実行タスク - 一般

パラメータとしてストアド プロシージャに渡される値を設定します。

2 番目の SQL 実行タスク - パラメータ マッピング

最終的に、制御フローは次のようになります。

制御フロー

パッケージが実行されると、テーブル行で定義されたすべてのストアド プロシージャがデータベースで利用可能である場合、上記の SELECT クエリによって返されるレコードの数だけ、ループによってストアド プロシージャが実行されます。ストアド プロシージャdbo.sp_generate_merge_scdbkを作成dbo.sp_generate_mergeし、同じパラメーター定義を使用しました。これが、パッケージが正常に実行された理由です。

実行

于 2012-10-30T17:05:52.477 に答える
3

正しい概念があります。変数、foreach ループ、SQL 実行タスクのパラメーターなどのいくつかの概念を使用する必要があるだけです。

制御フロー

制御フローは次のようになります

制御フロー

変数

SSISで定義された6つの変数があります

  • ディメンション | 文字列 | バラエティ
  • ETLスキーマ | 文字列 | stg
  • ETL テーブル | 文字列 | vw_VARIETY
  • 実行 | Int32 | 1
  • レコード セット | オブジェクト | System.Object
  • スキーマ | 文字列 | 薄暗い

最初の SQL 実行タスクは、クエリまたはそのような列挙可能なものになります。現在、提供されたクエリ値を生成するためにハードコードされたクエリがあります。あなたのソリューションは、SELECTのUNIONedのチェーンである可能性があります。この手順の目的は、RecordSet 変数を設定することです。

SQL 実行タスクが完全な結果セットを返す SQL を実行する

そして、私はそれを私のオブジェクトに押し込みます

結果セットタブ

ForEach ループ コンテナー (ADO レコードセット)

ForEach ループ コンテナーは、事前に確立した列挙可能なものを使用します。各行を通過し、オブジェクトから値をポップしてローカル変数に割り当てます。

列挙子を に変更しますForeach ADO Enumerator。結果を入力したオブジェクトを選択しUser::RecordSet、列挙モードを使用しますRows in first table

FELC

[変数マッピング] タブで、値の序数ベースの場所を特定します (列 0 は変数 X にマップされます)。ここでの唯一の秘訣は、SSIS 変数のデータ型がソース クエリからの結果セットのデータ型と一致することを確認することです。ゼロベースの順序システムであることに注意してください。

FELC 変数のマッピング

この時点で [実行] をクリックすると、RecordSet 変数に送信したすべての行が列挙されます。この時点で実行して、すべてのデータ型が揃っていることを確認すると便利です。

内部実行 SQL タスク

クエリを取得し、ハードコードされた値をプレース ホルダーに置き換えました。OLEDB 接続は使用?しますが、ADO.NET は named を使用します@varname

SQL 実行全般

[パラメーター マッピング] タブで、これらのローカル変数をプレース ホルダーにマップするだけです。

SQL パラメータ マッピングの実行

これで、さまざまな値で同じ proc を実行するための優れたテンプレートが作成されました。

于 2012-10-30T16:25:33.000 に答える