パッケージを実行する前に、処理する新しいレコードがあるかどうかを最初に確認しようとしています。 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に変更してソーステーブルを更新します。
ご協力いただければ幸いです。
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
に設定されているSSISプロジェクトで、選択したデータベースを指すOLE DBデータソースを作成します。データソースをパッケージの接続マネージャーに追加します。この例では、データソースという名前を使用しましたPractice
として。
パッケージの_Control Flow
_タブで、ツールボックスからSQL実行タスクをドラッグアンドドロップします。
以下に示すように、SQL実行タスクのGeneralページを構成します。
Check pre-execution
_を指定しますSingle row
_に変更しますPractice
に設定しますVariable
に設定します。User::SQLFetchCount
_に設定しますResult Set
_ページをクリックします以下に示すように、SQL実行タスクのResult Setページを構成します。
0
_に変更して、クエリによって返される最初の列の値を示しますUser::Processed
_に設定しますOK
をクリックしますパッケージの_Control Flow
_タブで、ツールボックスからメール送信タスクとデータフロータスクをドラッグアンドドロップします。 [制御フロー]タブは次のようになります。
SQL実行タスクとメール送信タスクを結合する緑色の矢印を右クリックします。 [編集...]をクリックして、緑色の矢印を優先順位制約と呼びます。
Precedence Constraint Editorで、次の手順を実行します。
Expression
に設定します@[User::Processed] == 0
_に設定します。つまり、変数Processedがゼロに設定されている場合にのみ、このパスを使用します。SQL実行タスクとデータフロータスクを結合する緑色の矢印を右クリックします。 [編集]をクリックします。優先順位制約エディターで、次の手順を実行します。
Expression
に設定します@[User::Processed] != 0
_に設定します。つまり、変数Processedがゼロに設定されていない場合にのみ、このパスを使用します。制御フロータブは次のようになります。電子メールを送信するメール送信タスクと、要件に応じてデータを更新するデータフロータスクを構成できます。
テーブルの作成スクリプトに基づいてデータセットを使用してパッケージを実行すると、処理されない行が1つあるため、パッケージはデータフロータスクを実行します。
スクリプト_UPDATE dbo.AR_Sale SET Processed = 1
_を使用してテーブル内のすべての行でProcessedフラグを1に設定した後にパッケージを実行すると、パッケージはメール送信タスクを実行します。
お役に立てば幸いです。
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