0

データベース 1 からデータベース 2 にデータを移行しようとしています。データベース 1 にはTableA、 と の 2 つの行がProduct_IDありProduct_Numます。データベース 2 の は、 がとが すべての小さいサブセットであることTableBを除いて、まったく同じ情報を保持します。に存在するものに対してのみ、 fromをinに挿入する必要があります。簡単な SQL ステートメントを使用してデータを移行できますが、このプロジェクトでは、すべて SSIS を使用して行う必要があります。TableB.Product_IDTableA.Product_IDTableB.Product_NumNULLProduct_NumTableAProduct_NumTableBProduct_IDsTableB

TableAOLE DB ソース ( ) を OLE DB 宛先 ( ) にリンクするデータ フロー タスクをセットアップしましたTableBが、それだけです。SELECT A.Product_Num FROM Database1.DBO.TableA A JOIN Database2.DBO.TableB B ON A.Product_ID = B.Product_IDOLE DB ソースにSQL コマンド ( ) を記述Product_Numし、OLE DB デスティネーションの列にマップしましたJOINが、一部の製品が原因です。私に何ができるか考えていますか?ありがとう。

4

1 に答える 1

2

問題の再表明

Database1 の一致するテーブルから、Database2 のすべてのデータの Product_Num を設定する必要があります。

接続マネージャー

への OLE DB 接続を確立しDatabase1Database2

データを取得する

現在のクエリを機能させるには、 と の間にリンク サーバーを確立する必要があり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 ソースの後にそれらのいずれかを追加して構成します。Database1Connection Managerを使用します (目的の参照データが含まれているため)。これが 2005 または 2008 以降のインストールであるかどうか、および一致しないオプションが存在するかどうかに応じて、一致しないエンティティを処理する必要があります。デフォルトでは、ルックアップは通過するすべての行に対して一致を見つける必要があります。通常、この動作をRedirect no match output2008 以降のインスタンス用に変更するか、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;
于 2013-09-23T20:03:00.450 に答える