【问题标题】:SQL Server - synchronizing 2 tables on 2 different databasesSQL Server - 同步 2 个不同数据库上的 2 个表
【发布时间】:2016-05-06 01:32:26
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    使用 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
    

    【讨论】:

    • 如果你使用物理表是的...如果你在内存中使用(@变量表)那么没有。我已经编辑了答案,以包含您所问内容的快速演示......
    • 请记住,MERGE 是一个原子语句(这是您想要的),但具有隐含的事务要求,如果您要跨服务器运行,MSDTC 可能会失败。查询计划有时也可能是一个问题。这是您的最佳选择,但有时会遇到一些挑战
    • 如何在每次更改源表后自动执行此操作?
    • @Fred 您可以为此使用更改跟踪功能。
    • 两张表是否必须具有相同的主键外键等?或者只要列名/类型相同,这仍然有效吗?
    【解决方案2】:

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

    还有一个围绕它的 GUI 包装器http://code.google.com/p/sqltablediff/,这使工作更加轻松。它会为你生成命令行。

    然后可以创建一个定时任务运行命令行,然后执行生成的sql脚本。

    【讨论】:

    • 我喜欢这个解决方案,不相信它在后台运行,但对于夜间报告非常有用:-)
    • 第二个解决方案...我们发现通过 SQL Server 代理调用的 bat 脚本运行 tablediff.exe 正是我们需要的。
    【解决方案3】:

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

    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

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多