web-dev-qa-db-ja.com

SSIS OLEDB宛先の行を更新する

次のようなOLEDBソースとOLEDB宛先があるデータフロープロセスがあります。

Data Flow Task

ソースは2つのステージングテーブルのデータをマージし、結果セット(たとえば、5万行)を返します。これらの50K行は宛先テーブルにも存在しますが、古いデータです。

SELECT * FROM staging1
UNION
SELECT * FROM staging2 

一般に、OLEDB宛先では、返されたデータセットをソースから宛先テーブルに挿入しますが、私の場合、これらの新しい50K行で古い50K行を更新する必要があります。

一括更新の種類。

誰でも私にそれを行う方法を教えてもらえますか?私はあなたの助けに感謝します。

25
Rahul

さて、私の問題の解決策を見つけました。以下のような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
2
Rahul

OOBコンポーネントを使用して、データフロータスク内のSSISで一括更新を行うことはできません。

一般的なパターンは、挿入、更新、削除を識別し、更新と削除をステージングテーブルにプッシュし、データフロータスクの後に、SQLベースの実行タスクでセットベースの更新または削除を使用することです。 Andy Leonardの 統合サービスへの階段 を見てください。記事を「セットベースの更新」まで3/4スクロールダウンして、パターンを確認します。

ステージデータ

http://www.sqlservercentral.com/Images/11369.png

セットベースの更新

enter image description here

このようなパターンを使用すると、些細な量のデータ以外にOLE DB Command変換を使用するよりもはるかに優れたパフォーマンスが得られます。

サードパーティのツールを使用している場合、CozyRocとPragmaticWorksにはマージ先コンポーネントがあると思います。

37
billinkc

Lookupstageを使用して、挿入するか更新するかを決定します。詳細については、このリンクを確認してください- http://beingoyen.blogspot.com/2010/03/ssis-how-to-update-instead-of-insert.html

更新手順:

  1. [oledb宛先の代わりに] OLEDBコマンドをドラッグ
  2. プロパティウィンドウに移動
  3. [カスタムプロパティ]で[SQLCOMMAND]を選択し、更新コマンドexを挿入します。

    UPDATE table1 SET col1 =?、col2 =?ここでid =?

  4. 更新コマンドのように、ソースから出力まで列を正確な順序でマップします

17
rs.