問題の再表明
Database1 の一致するテーブルから、Database2 のすべてのデータの Product_Num を設定する必要があります。
接続マネージャー
への OLE DB 接続を確立しDatabase1
、Database2
データを取得する
現在のクエリを機能させるには、 と の間にリンク サーバーを確立する必要がありDatabase1
ますDatabase2
。
もう 1 つのオプションは、クエリを使用してDatabase2
、番号が必要なすべての Product_ID のリストを生成することです。
SELECT A.Product_ID FROM dbo.TableA AS A WHERE A.Product_Num IS NULL;
不足しているデータを追加する
これは、リンク サーバーがセットアップされていないことを前提としています。質問で結合という用語を使用しましたが、ありMerge Join
ますが、このシナリオでは必要ないと思います。代わりに、Lookup Component
. OLE DB ソースの後にそれらのいずれかを追加して構成します。Database1
Connection Managerを使用します (目的の参照データが含まれているため)。これが 2005 または 2008 以降のインストールであるかどうか、および一致しないオプションが存在するかどうかに応じて、一致しないエンティティを処理する必要があります。デフォルトでは、ルックアップは通過するすべての行に対して一致を見つける必要があります。通常、この動作をRedirect no match output
2008 以降のインスタンス用に変更するか、2005 用に「失敗したルックアップを無視する」(概算) に変更します。
フル キャッシュのままにします (ボックスのメモリが不足している場合やソース テーブルが大きすぎる場合を除きます)。
書きたいクエリは
SELECT B.Product_Num, B.Product_ID FROM dbo.TableB AS B;
OLE DB ソース (左側) の [Product_ID] をルックアップ (右側) の [Product_ID] に接続し、Product_Num を確認します。
データの更新
この時点で、データ フローには、B の Product_ID と A の対応する Product_Num の 2 つの列があります。SSIS の課題は、更新が実際には存在しないことです。SSIS は頻繁に挿入されるように設計されており、その点ではチャンピオンのように動作します。ただし、更新はデフォルトでシングルトン操作です。行を更新、行を更新、行を更新...これを、挿入の目的のセットベースのアプローチと対比します (ブーム100000 行追加、ブーム別の N 行追加) 。
すぐに使用できるアプローチは、OLE DB コマンド オブジェクトを使用し、そこに更新ステートメントを記述することです。10、100、1000 回の更新では、おそらく何もありません。100万行を更新?そのアプローチはスケールしません。
大規模な更新のアプローチは、ステージング テーブルに対して SSIS が非常にうまく機能する (INSERT) ために SSIS を使用し、ステージング テーブルからターゲット テーブルに対してセット ベースの UPDATE (SQL タスクの実行) のポスト データ フロー ステップを実行することです。 . これは、ターゲット サーバーでテーブルを作成できることを前提としています。私がこれまで行ってきたいくつかの仕事は選択肢ではありませんでした。
UPDATE B
SET
Product_Num = S.Product_Num
FROM
Stage.TableC S
INNER JOIN
dbo.TableB B
ON B.Product_ID = S.Product_ID
WHERE
B.Product_Num IS NULL;