web-dev-qa-db-ja.com

クエリによって返されるレコードカウントに基づいてSSISパッケージフローを制御する方法

パッケージを実行する前に、処理する新しいレコードがあるかどうかを最初に確認しようとしています。 SQL Server 2008 R2テーブルに「処理済み」というビットフィールドがあり、処理済みの場合は値が1で、処理されていない場合は値が0です。

このようにクエリしたい:

select count(processed) from dbo.AR_Sale where processed = 0

結果が0の場合、レコードが存在しないという電子メールを送信します。ゼロより大きい場合、パッケージの実行を続行します。私はSSISを初めて使用しますが、これに使用するツールがわからないようです。

パッケージには、データベースへのOLE DB接続が含まれるデータフローアイテムがあります。接続では、クエリを使用してレコードを返します。残念ながら、クエリは正常に完了します)処理するレコードはありません。クエリは次のとおりです。

Select * from dbo.AR_Sale where processed = 0

これらのレコードをデータウェアハウスにコピーしてから、別のクエリを実行して、処理済みフィールドを0から1に変更してソーステーブルを更新します。
ご協力いただければ幸いです。

14
user1756753

1つのオプションは、この機能を実現するためにSQL実行タスクと併せて優先順位制約を使用することです。 _SSIS 2008 R2_でこれを実現する方法の例を次に示します。

質問で提供された情報に基づいて簡単なテーブルを作成しました。

テーブルスクリプトの作成

_CREATE TABLE dbo.AR_Sale(
    Id int NOT NULL IDENTITY PRIMARY KEY,
    Item varchar(30) NOT NULL,
    Price numeric(10, 2) NOT NULL,
    Processed bit NOT NULL
) 
GO
_

次に、新しいテーブルにサンプルデータを入力しました。行の1つでProcessedフラグがゼロに設定されていることがわかります。

テーブルスクリプトに入力

_INSERT INTO dbo.AR_Sale (Item, Price, Processed) VALUES
    ('Item 1', 23.84, 1),
    ('Item 2', 72.19, 0),
    ('Item 3', 45.73, 1);
_

SSISパッケージで、次の2つの変数を作成します。

  • Processedデータ型_Int32_
  • SQLFetchCountデータ型Stringの値がSELECT COUNT(Id) ProcessedCount FROM dbo.AR_Sale WHERE Processed = 0に設定されている

Variables

SSISプロジェクトで、選択したデータベースを指すOLE DBデータソースを作成します。データソースをパッケージの接続マネージャーに追加します。この例では、データソースという名前を使用しましたPracticeとして。

パッケージの_Control Flow_タブで、ツールボックスからSQL実行タスクをドラッグアンドドロップします。

以下に示すように、SQL実行タスクのGeneralページを構成します。

  • 適切なName、たとえば_Check pre-execution_を指定します
  • クエリがスカラー値を返すため、ResultSetを_Single row_に変更します
  • ConnectionをOLE DBデータソース、この例ではPracticeに設定します
  • 変数に格納されたクエリを使用するため、SQLSourceTypeVariableに設定します。
  • SourceVariableを_User::SQLFetchCount_に設定します
  • 左セクションの_Result Set_ページをクリックします

Execute SQL Task - General

以下に示すように、SQL実行タスクのResult Setページを構成します。

  • [追加]ボタンをクリックして、クエリによって返されたカウント値を格納する新しい変数を追加します
  • 結果名を_0_に変更して、クエリによって返される最初の列の値を示します
  • 変数名を_User::Processed_に設定します
  • OKをクリックします

Execute SQL Task - Result Set

パッケージの_Control Flow_タブで、ツールボックスからメール送信タスクとデータフロータスクをドラッグアンドドロップします。 [制御フロー]タブは次のようになります。

Control Flow tab

SQL実行タスクとメール送信タスクを結合する緑色の矢印を右クリックします。 [編集...]をクリックして、緑色の矢印を優先順位制約と呼びます。

Right-click constraint 1

Precedence Constraint Editorで、次の手順を実行します。

  • 評価操作Expressionに設定します
  • Expressionを_@[User::Processed] == 0_に設定します。つまり、変数Processedがゼロに設定されている場合にのみ、このパスを使用します。
  • OKをクリック

Equal to zero

SQL実行タスクとデータフロータスクを結合する緑色の矢印を右クリックします。 [編集]をクリックします。優先順位制約エディターで、次の手順を実行します。

  • 評価操作Expressionに設定します
  • Expressionを_@[User::Processed] != 0_に設定します。つまり、変数Processedがゼロに設定されていない場合にのみ、このパスを使用します。
  • OKをクリック

Not equal to zero

制御フロータブは次のようになります。電子メールを送信するメール送信タスクと、要件に応じてデータを更新するデータフロータスクを構成できます。

Control Flow final

テーブルの作成スクリプトに基づいてデータセットを使用してパッケージを実行すると、処理されない行が1つあるため、パッケージはデータフロータスクを実行します。

Data Flow Task logic

スクリプト_UPDATE dbo.AR_Sale SET Processed = 1_を使用してテーブル内のすべての行でProcessedフラグを1に設定した後にパッケージを実行すると、パッケージはメール送信タスクを実行します。

Send Mail Task logic

お役に立てば幸いです。

64
user756519

SSISの設計は

Src:

Select count(processed) Cnt from dbo.AR_Sale where processed = 0

条件分割ステージ[データフロー変換中]:

output1: Order 1, Name - EmailCnt, Condition - Cnt = 0
output2: Order 2, Name - ProcessRows, Condition - Cnt > 0

出力リンク:

EmailCnt Link: Send email

ProcessRowsLink: DataFlowTask
4
rs.