SQL Server 2008 R2を搭載した同じサーバー上の2つの異なるデータベースに同じスキーマを持つ2つのテーブルがあります。 1つのテーブルがデータでより頻繁に更新されます。
ここで、これらの2つのテーブルを同期させる必要があります。これは夜間のプロセスとして発生する可能性があります。同期を達成するための最良の方法は何ですか。処理する ?
MERGEを使用するのが最善の策です。それぞれの条件を制御できます。一致したとき、一致していないときなど.
例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
おそらく、SQLサーバーのtablediff.exeコマンドラインユーティリティを使用できます。 2つのテーブル間でテーブルごとの1回限りの比較を実行し、destをソースに同期するためのSQLを自動的に生成できます。
その周りにGUIラッパーもあります http://code.google.com/p/sqltablediff/ これにより、作業がさらに簡単になります。コマンドラインが生成されます。
次に、スケジュールされたタスクを作成してコマンドラインを実行し、生成されたSQLスクリプトを実行します。
さまざまなデータベースから選択し、カーソルを使用して選択したデータをループできます。そのカーソル内で、ロジックを実行し、ターゲットテーブルから更新または削除できます。
また、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