次のようなOLEDBソースとOLEDB宛先があるデータフロープロセスがあります。
ソースは2つのステージングテーブルのデータをマージし、結果セット(たとえば、5万行)を返します。これらの50K行は宛先テーブルにも存在しますが、古いデータです。
SELECT * FROM staging1
UNION
SELECT * FROM staging2
一般に、OLEDB宛先では、返されたデータセットをソースから宛先テーブルに挿入しますが、私の場合、これらの新しい50K行で古い50K行を更新する必要があります。
一括更新の種類。
誰でも私にそれを行う方法を教えてもらえますか?私はあなたの助けに感謝します。
さて、私の問題の解決策を見つけました。以下のようなSSISでSQLクエリとSQLタスクを使用してすべての行を更新します。将来同じ課題に直面した場合、他の人を助けるかもしれません。
update Original
set Original.Vaal= t.vaal
from Original join (select * from staging1 union select * from staging2) t
on Original.id=t.id
OOBコンポーネントを使用して、データフロータスク内のSSISで一括更新を行うことはできません。
一般的なパターンは、挿入、更新、削除を識別し、更新と削除をステージングテーブルにプッシュし、データフロータスクの後に、SQLベースの実行タスクでセットベースの更新または削除を使用することです。 Andy Leonardの 統合サービスへの階段 を見てください。記事を「セットベースの更新」まで3/4スクロールダウンして、パターンを確認します。
ステージデータ
セットベースの更新
このようなパターンを使用すると、些細な量のデータ以外にOLE DB Command
変換を使用するよりもはるかに優れたパフォーマンスが得られます。
サードパーティのツールを使用している場合、CozyRocとPragmaticWorksにはマージ先コンポーネントがあると思います。
Lookupstageを使用して、挿入するか更新するかを決定します。詳細については、このリンクを確認してください- http://beingoyen.blogspot.com/2010/03/ssis-how-to-update-instead-of-insert.html
更新手順:
[カスタムプロパティ]で[SQLCOMMAND]を選択し、更新コマンドexを挿入します。
UPDATE table1 SET col1 =?、col2 =?ここでid =?
更新コマンドのように、ソースから出力まで列を正確な順序でマップします