web-dev-qa-db-ja.com

SQL Server 2012インポートWizard新しいデータのみを追加

SQL Server 2012のインポートウィザードを使用して、データベースAからデータベースBにデータをインポートしています。

  • ソース:DatabaseAテーブルA
  • 宛先:データベースBテーブルB

うまく機能するソースクエリを作成しましたが、2つのオプションしかありません

  1. 宛先データを削除-すべてを取得
  2. データを追加する-しかし、これは重複を作成します(つまり、すべてをもう一度繰り返します)

だから私はソースクエリを以下のようなものに変更してみたかった

select col1, col2, col3 from A where col1 not in (select col1 from 
DatabaseB.dbo.B)

言い換えると、データベースAのテーブルAからプルしているデータが、データベースBのテーブルBにまだ存在していないことをテストしたいと思います。ここで、col1は一意の値です。

私はこれを何度も何度も行うことができるようにしたいのですが、デルタデータを横切るだけです

私がこれをしようとするたびに、私は述べるエラーが出ます

据え置き準備を完了できませんでした。
ステートメントを準備できませんでした。
キーワード「in」付近の構文が正しくありません。 (Microsoft SQL Server Native Client 11.0)

注目に値するいくつかの追加事項(いくつかの手掛かりを与える可能性があります)

  1. DatabaseAとDatabaseBは別々のサーバーにあります
  2. DatabaseA.A.col1はID列です
  3. DatabaseB.Bは、Aの列と一致するように作成したテーブルです。ID列や主キーがないため、後で実行する移行スクリプトのステージングテーブルにすぎません。
1
Crudler

インポート/エクスポートウィザードは、舞台裏でSSISパッケージを構築してEL(抽出と読み込み)を実行します。合理化されたツールであるため、実際には変換機能はありません。

あなたがしようとしていることは、存在に基づいて条件付きでデータをロードすることです。それは結構です、それは一般的なパターンです。

機能していないクエリで解決しようとしています。

select col1, col2, col3 from A where col1 not in (select col1 from 

DatabaseB.dbo.B)

これは、DatabaseBがAと同じインスタンス上にあると想定しています。 AとBの間にリンクサーバーを確立した場合、クエリは機能します-許容レベルで実行するかどうかは別問題です。

select col1, col2, col3 from A where col1 not in (select col1 from 

Server2.DatabaseB.dbo.B)

これを行うSSISのネイティブな方法は、ソースと宛先の間にcol1に基づいて一致するルックアップを追加することですが、インポートエクスポートウィザードでは実行できません。 Visual Studio/SQL Serverデータツール(SSDT)を使用してパッケージを編集する必要があります。

reasonsのパッケージを編集できない場合は、2つのパッケージをビルドする必要があります。 1つ目は、すべてのCol1 IDを宛先からソースにエクスポートして戻します。次に、サーバーをクロスする代わりに、ソースクエリを変更して、IDのローカルキャッシュを参照できます。

万能の読み方-> 階段への統合サービス ステップ3は、あなたが探している増分負荷であると思います

1
billinkc