web-dev-qa-db-ja.com

SSISでOUTPUT $ action、Inserted。*、Deleted。*レコードを取得する方法

T-SQLのMERGEでは、OUTPUT $actionInserted.*およびDeleted.* 記録。どうすればOUTPUT $actionInserted.*Deleted.* SSISのレコード?

2
NinjaDeveloper

あなたはできない、いや、短い答えです。

データを変更できるデータフロータスクに3つのishコンポーネントがあります。 OLE DB/ADO.NET Destination、OLE DBコマンドとスクリプトコンポーネント。

コンポーネントのスイスアーミーナイフであるため、この回答のスクリプトコンポーネントは無視しています。何か悪いことをしたい場合は、スクリプトコンポーネントを使用してください。ミニチュアソーでセコイアの木を切り倒すことが現実的であるかどうかは、別の問題です。

OLE DB Destinationは、それが宛先です。行を押し出すのではなく、消費するだけです。はい、技術的には行をプッシュできますが、それはエラー出力パスを介してのみであり、OUTPUT仮想テーブルへのアクセスの問題を解決しません。

OLE DBコマンドは有望に聞こえます。データフローに列を追加できます。大きなBIG、[〜#〜] big [〜#〜]の欠点は、セットベースのコンポーネントではないことです。流れる個々の行ごとに操作します。数十、数百、多分数千の行がある場合、このシングルトンの動作はおそらくシステムを殺すことにはなりません。 MERGEing lakhs +のデータは、おそらくあなたに悪い時間をもたらすでしょう。

このアプローチに夢中になっている場合、SSISeyにする方法である [〜#〜] merge [〜#〜] で失敗を認識すると、2つのデータフローコンポーネントを持つことになります。

1つ目は、すべてのデータを宛先テーブルに書き込みます。既存のDFを取り、すべてのデータを新しいテーブルに書き込みます。

2番目の新しいデータフローは、MERGEステートメントを使用し、付随する仮想テーブルを必要に応じて指定します。私は 最初に削除 パターンについて話しました。そのSO質問でOUTPUTテーブルを使用したので、MERGEは異なるはずではありません。

5
billinkc

SQL 2012以降には、 WITH RESULT SETS オプションがあります。これにより、SSISで結果セットのメタデータが理解されず、問題が発生することなく、OUTPUT句からの出力を簡単に使用できます。 SSISソースコンポーネントのOUTPUT句からの出力(例OLE DB Source)。

MERGEを含むストアドプロシージャと、アクションをキャプチャするOUTPUT句を使用して簡単な例を設定しました。 OLE DB Sourceコンポーネントがストアドプロシージャを呼び出し、MERGEが実行され、OUTPUTがプロシージャからの結果セットとして配信されます。その後、宛先に結合できます。例OLE DB Destinationまたはその他のデータフロー変換。

enter image description here

これを行うべきかどうかは別の質問です。データフローパイプラインで出力を必要とする特定の理由がない限り、出力を消費するために別のプロシージャを使用する方がよいでしょう。 SSISの真の力は、異なるサーバー間でデータを移動するため、カスタム.netタスク、およびタスクを並行して実行するためのものです。

2
wBob