web-dev-qa-db-ja.com

SQL Server-2つの異なるデータベースで2つのテーブルを同期する

SQL Server 2008 R2を搭載した同じサーバー上の2つの異なるデータベースに同じスキーマを持つ2つのテーブルがあります。 1つのテーブルがデータでより頻繁に更新されます。

ここで、これらの2つのテーブルを同期させる必要があります。これは夜間のプロセスとして発生する可能性があります。同期を達成するための最良の方法は何ですか。処理する ?

17
GilliVilla

MERGEを使用するのが最善の策です。それぞれの条件を制御できます。一致したとき、一致していないときなど.

MERGE-Technet

MERGE- MSDN(GOOD!)

例A:トランザクションの使用法-テーブル変数-NO

DECLARE @Source TABLE (ID INT)
DECLARE @Target TABLE (ID INT)

INSERT INTO @Source (ID) VALUES (1),(2),(3),(4),(5)

BEGIN TRANSACTION

MERGE @Target AS T
USING @Source AS S
ON (S.ID = T.ID)
WHEN NOT MATCHED THEN
    INSERT (ID) VALUES (S.ID);

ROLLBACK TRANSACTION
SELECT  'FAIL' AS Test,*
FROM    @Target

例B:トランザクションの使用-物理テーブル

CREATE TABLE SRC (ID INT);
CREATE TABLE TRG (ID INT);

INSERT INTO SRC (ID) VALUES (1),(2),(3),(4),(5)

BEGIN TRANSACTION

MERGE TRG AS T
USING SRC AS S
ON (S.ID = T.ID)
WHEN NOT MATCHED THEN
    INSERT (ID) VALUES (S.ID);

ROLLBACK TRANSACTION
SELECT  'FAIL' AS Test,*
FROM    TRG

例C:トランザクションの使用-Tempdb(ローカルおよびグローバル)

CREATE TABLE #SRC (ID INT);
CREATE TABLE #TRG (ID INT);

INSERT INTO #SRC (ID) VALUES (1),(2),(3),(4),(5)

BEGIN TRANSACTION

MERGE #TRG AS T
USING #SRC AS S
ON (S.ID = T.ID)
WHEN NOT MATCHED THEN
    INSERT (ID) VALUES (S.ID);

ROLLBACK TRANSACTION
SELECT  'FAIL' AS Test,*
FROM    #TRG
18
Mathew A.

おそらく、SQLサーバーのtablediff.exeコマンドラインユーティリティを使用できます。 2つのテーブル間でテーブルごとの1回限りの比較を実行し、destをソースに同期するためのSQLを自動的に生成できます。

その周りにGUIラッパーもあります http://code.google.com/p/sqltablediff/ これにより、作業がさらに簡単になります。コマンドラインが生成されます。

次に、スケジュールされたタスクを作成してコマンドラインを実行し、生成されたSQLスクリプトを実行します。

4
java4script

さまざまなデータベースから選択し、カーソルを使用して選択したデータをループできます。そのカーソル内で、ロジックを実行し、ターゲットテーブルから更新または削除できます。

また、SQL 2008には、1つのT-SQLクエリで選択/挿入/更新するために使用できる、素晴らしい新しいMERGEステートメントがあります。 http://technet.Microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx

より複雑なプロセスでは、最初のオプションを使用します。より単純な同期タスクでは、2番目のオプションを使用します。

追加オプションとして、サーバー統合サービス(SSIS)もあります。 http://blogs.msdn.com/b/jorgepc/archive/2010/12/07/synchronize-two-tables-using-sql- server-integration-services-ssis-part-i-of-ii.aspx

1
Tys