zoukankan      html  css  js  c++  java
  • SQL Server – 使用 Merge 语句实现表数据之间的对比同步

    表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等。包括在 SSIS Package 中也可以通过 Lookup, Condition Split 等多种 Task 的组合来实现表数据之间的同步。在这里 “同步” 的意思是指每次执行一段代码的时候能够确保 A 表的数据和 B 表的数据始终相同。

    可以通过 SQL Server 中提供的 Merge 语句来实现,并且还可以将操作的细节记录下来。具体的细节内容请参照 – http://msdn.microsoft.com/zh-cn/library/bb510625.aspx  我这里只用一个简单的示例来介绍一些它的常见功能。

    测试表 – 一个 Source 表,一个 Target 表和一个日志记录表,用来记录每次所执行的操作。

    下面是主要的同步操作

    MERGE INTO – 数据的目的地,将数据最终 MERGE 到的表对象

    USING 与源表连接 ON 关联的条件

    WHEN MATCHED – 如果匹配成功,即关联条件成功 (这时就应该将 SOURCE 中其它的所有字段值更新到 TARGET 表中)

    WHEN NOTMATCHED BY TARGET – 如果匹配不成功 (TARGET 中没有这一条记录但是 SOURCE 表有,说明 SOURCE 表多了新数据因此应该插入到 TARGET 表中)

    WHEN NOTMATCHED BY SOURCE – 如果匹配不成功 (SOURCE 中没有这一条记录但是 TARGET 表有,说明 SOURCE 表可能把这条数据删除了,所以 TARGET 也应该删除)

    MERGE INTO @TargetTable AS T           
    USING @SourceTable AS S                
       ON T.ID = S.ID                      
    WHEN MATCHED         
       THEN UPDATE SET T.DSPT = S.DSPT  
    WHEN NOT MATCHED BY TARGET   
       THEN INSERT VALUES(S.ID,S.DSPT)
    WHEN NOT MATCHED BY SOURCE            
       THEN DELETE
    OUTPUT $ACTION AS [ACTION],
       Deleted.ID AS 'Deleted ID',
       Deleted.DSPT AS 'Deleted Description',
       Inserted.ID AS 'Inserted ID',
       Inserted.DSPT AS 'Inserted Description'
    INTO @Log;

    还要注意的是有一些限制条件:

    • 在 Merge Matched 操作中,只能允许执行 UPDATE 或者 DELETE 语句。
    • 在 Merge Not Matched 操作中,只允许执行 INSERT 语句。
    • 一个 Merge 语句中出现的 Matched 操作,只能出现一次 UPDATE 或者 DELETE 语句,否则就会出现下面的错误 – An action of type ‘WHEN MATCHED’ cannot appear more than once in a ‘UPDATE’ clause of a MERGE statement.
    • Merge 语句最后必须包含分号,以 ; 结束。

    执行一下上面的 MERGE 语句查看一下结果,两个表的数据一模一样了 –

    ID = 1,2,3 的记录在 Source 表和Target 表都存在,因此执行的是 UPDATE 操作。

    ID = 4,5 的记录在 Source 表存在,但是在 Target 表不存在,因此执行的是 INSERT 操作。

    ID = 6,7 的记录在 Target 表存在,但是在 Source 表不存在,因此执行的是 DELETE 操作。

  • 相关阅读:
    安装VMtools vim编辑器的使用 压缩包命令 Linux下的用户管理 (第三天)
    VM虚拟机安装 常用Linux命令 网卡配置 (第二天)
    数据库的交互模式 常用的dos命令 (第一天)
    Validate US Telephone Numbers FreeCodeCamp
    Arguments Optional FreeCodeCamp
    Everything Be True FreeCodeCamp
    Binary Agents FreeCodeCamp
    Steamroller FreeCodeCamp
    Drop it FreeCodeCamp
    Smallest Common Multiple FreeCodeCamp
  • 原文地址:https://www.cnblogs.com/syncnavigator/p/10189040.html
Copyright © 2011-2022 走看看