31

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

データフロータスク

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

SELECT * FROM staging1
UNION
SELECT * FROM staging2 

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

一括更新の一種。

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

4

3 に答える 3

43

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

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

ステージデータ

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

ベースの更新を設定する

ここに画像の説明を入力してください

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

サードパーティのツールに興味がある場合は、CozyRocとPragmaticWorksにマージ先コンポーネントがあることを知っています。

于 2012-05-11T19:33:20.190 に答える
22

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

更新を行う手順:

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

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

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

于 2012-05-11T17:19:16.077 に答える
2

さて、私の問題の解決策を見つけました。以下のように、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
于 2012-05-13T20:48:19.960 に答える