SQL Server - 在2个不同的数据库上同步2个表

时间:2012-11-28 20:39:19

标签: database tsql synchronization sql-server-2008-r2

我在与SQL Server 2008 R2相同的服务器上的2个不同数据库上有2个具有相同架构的表。 一个表更频繁地更新数据。

现在需要保持这两个表同步。这可能发生在夜间过程中。 实现同步的最佳方法是什么。过程?

3 个答案:

答案 0 :(得分:17)

使用MERGE是您最好的选择。您可以控制每个条件。当那么匹配时,那么就等了。

MERGE - Technet

MERGE- MSDN (GOOD!)

示例A:交易使用 - 表变量 - 否

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

答案 1 :(得分:4)

您可能可以使用sql server的tablediff.exe命令行实用程序。它可以逐表,一次性比较两个表并自动生成sql,以便将dest同步到源。

它周围还有一个GUI包装器http://code.google.com/p/sqltablediff/,这使得工作变得更加容易。它将为您生成命令行。

然后,您可以创建一个计划任务来运行命令行,然后执行生成的sql脚本。

答案 2 :(得分:1)

您可以从不同的数据库中进行选择,并使用游标循环选定的数据。在该游标中,您可以执行一些逻辑并从目标表中更新或删除。

SQL 2008还有一个很好的新MERGE语句,您可以使用它在一个T-SQL查询中选择/插入/更新。 http://technet.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx

对于更复杂的流程,我使用第一个选项。对于更直接的同步任务,我使用第二个选项。

作为额外选项,还有服务器集成服务(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