15

パッケージを実行する前に、処理する新しいレコードがあるかどうかを最初に確認しようとしています。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 に変更してソース テーブルを更新します

4

2 に答える 2

66

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
  • SQLFetchCountString値がに設定されたデータ型のSELECT COUNT(Id) ProcessedCount FROM dbo.AR_Sale WHERE Processed = 0

変数

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

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

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

  • 適切な名前を付けて、言うCheck pre-execution
  • クエリがスカラー値を返すため、ResultSetを に変更しますSingle row
  • この例では、接続を OLE DB データソースに設定します。Practice
  • 変数に格納されたクエリを使用するため、 SQLSourceTypeを に設定します。Variable
  • SourceVariableを_User::SQLFetchCount
  • Result Set左のセクションのページをクリックします

SQL タスクの実行 - 一般

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

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

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

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

制御フロー タブ

SQL 実行タスクとメール送信タスクを結合する緑色の矢印を右クリックします。Edit... をクリックします。緑色の矢印は Precedence Constraint と呼ばれます。

右クリック制約 1

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

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

ゼロに等しい

SQL 実行タスクとデータ フロー タスクを結合する緑色の矢印を右クリックします。Edit... をクリックします。 Precedence Constraint Editor で、次の手順を実行します。

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

ゼロに等しくない

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

制御フロー最終

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

データ フロー タスクのロジック

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

メール送信タスクのロジック

それが役立つことを願っています。

于 2012-10-18T17:42:41.420 に答える
4

あなたのSSIS設計は

ソース:

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

Conditional Split ステージ [データ フロー変換の下]:

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

出力リンク:

EmailCnt Link: Send email

ProcessRowsLink: DataFlowTask
于 2012-10-18T15:48:14.770 に答える