web-dev-qa-db-ja.com

SSISで、処理する必要があるソースから返された行数を取得するにはどうすればよいですか。

SSISパッケージにログを追加するプロジェクトに取り組んでいます。いくつかのイベントハンドラーを実装して、独自のカスタムログを作成しています。 OnInformationイベントを実装して、時刻、ソース名、およびメッセージをログファイルに書き込みました。データが1つのテーブルから別のテーブルに移動されると、OnInformationイベントは次のようなメッセージを表示します。

コンポーネント「TABLENAME」(1)」は87行を書き込みました。

行の1つに障害が発生し、予想される87行のうち85行のみが処理されたとすると、上記の行はwrote 85 rowsと表示されると思います。この場合、処理する必要がある行数を追跡するにはどうすればよいですか? wrote 85 of 87 rowsのようなものが欲しいのですが。基本的に、ソースのクエリから返される行数を取得する方法を知る必要があると思います。これを行う簡単な方法はありますか?

ありがとうございました

5
nleidwinger18

データソースの後に_Row Count transaformation_を使用して、変数を保存できます。これは、処理される行数になります。宛先にロードされたら、_Execute SQL Task_で_Control flow_を使用し、Select Count(*) from <<DestinationTable>>を使用して、カウントをOther変数に保存する必要があります[クエリでWhere句を使用する必要があります現在の負荷を特定する]。したがって、ロギング用に処理された行数があります。

お役に立てれば!

6
Gowdhaman008

コメントにフィードバックを提供するのに十分なスペースがありません。私はその日のために出発する必要があるので、不完全な答えを投稿します。

あなたはあなたが求めていることを達成するのに苦労するでしょう。 Gowdhaman008の回答のコメントに基づくと、変数の値は、ファイナライザーイベントが発生するまでデータフローの外部に表示されません(OnPostExecute、私は思います)。スクリプトタスクを使用して行をカウントし、カスタムまたは事前定義されたイベントを発生させてパッケージの進行状況を報告することにより、そのデータをごまかして取り出すことができます。実際、OnPipelineRowsSentイベントをキャプチャするだけです。これにより、特定の分岐点を通過している行の数とその周囲の時間が記録されます。 SSISパフォーマンスフレームワーク さらに、カスタム作業やメンテナンスを行う必要はありません。箱から出してすぐに使える機能は間違いなく勝利です。

とは言うものの、ソースが終了するまで、ソースからいくつの行が出ているかを実際に知ることはできません。それはばかげているように聞こえます、そして私は完全に同意します、しかしそれは真実です。単純なケースを想像してみてください。OLE DBソースが1,000,000行を直接OLE DB宛先に送信します。おそらく、100万行すべてが送信されるわけではありません。パイプラインで開始するには、最初のバッファに10kだけが含まれる可能性があります。これらのバッファは宛先にプッシュされ、10k行のうち10k行が処理されたことがわかります。泡立てて、すすぎ、数回繰り返し、このバッファで、行にNULLがあるべきではありません。ブームがダイナマイトになり、プロセスが失敗します。パイプラインに60k行が流れしました。これですべてです。私たちは失敗のために知っています。

すべてのソース行を確実に把握する唯一の方法は、パイプラインに非同期変換を入れて、すべてのデータが到着するまですべてのダウンストリームコンポーネントをブロックすることです。これにより、パッケージから優れたパフォーマンスが得られる可能性がなくなります。変数の更新に関する前述の制限は引き続き適用されますが、FireXEventメッセージは、キューで処理された可能性のある行数を正確に記述します。

明示的なトランザクションを開始した場合は、SQL実行タスクのような醜いことをして、期待されるカウントを取得し、それを変数に書き込んでから、処理された行をログに記録することができますが、データを二重にクエリしているため、ブロックされる可能性が高くなりますダブルポンプのため、ソースシステムで。そして、それはデータベースのようなものでのみ機能します。同じ概念がフラットファイルにも当てはまりますが、最初にすべての行を読み取るためのスクリプトタスクが必要になる点が異なります。

これが醜くなるのは、Webサービスのように起動が遅いデータソースの場合です。デフォルトのバッファサイズでは、データの到着を待機しているため、パッケージ全体が単純化する必要があるよりもはるかに長く実行される可能性があります スロースタート

私がすること

行数を使用して 開始数とエラー数 (およびそれ以上)を記録します。これは、入ってくるすべてのデータとそれがどこに行ったかを説明するのに役立ちます。次に、OnPipelineRowsSentイベントをオンにして、ログをクエリし、今すぐログを通過している行数を確認できるようにします。

enter image description here

4
billinkc

必要なのは 行数変換 です。ソースクエリの後にデータフローに追加し、その出力を変数に割り当てるだけです。次に、その変数をログファイルに書き込むことができます。

2
Kyle Hale

これが私が現在していることです。非常に面倒ですが、機能します。

1) SSIS Method

2)すべてのレコードに一定の「1」値があります。それらは文字通りすべて同じです。

3)マルチキャストステップを使用して、データフローを2方向に送信します。すべて同じですが、それでもその定数値でソートする必要があります。

4)集計ステップを使用してその定数を集計し、それを再利用して最下部のデータフローに結合します(集計なしで実際のデータレコードをすべて保持します)。

これを行うと、最初の行数を取得できます。

  1. 後で、以下に示すように、条件付き分割ステップを使用し、条件を適用した後に同じことを再度実行します。行数が同じであれば、すべて問題なく、問題はありません。

行数が同じでない場合は、問題があります。

Checking for Success

これは、別のデータフローステップを使用せずに問題を解決するためのアプローチの一般的な考え方です。

TLDR:

マルチキャストを使用して1つの条件の行数を取得し、定数値で並べ替えて、集計手順を実行します。

ソートとマージを実行して、行数を取得します。

条件付き分割を使用して、もう一度実行します。

前後の行数が同じ場合は、これを実行します。

前後の行数が同じでない場合は、それを行います。

0
LunchBox