T-SQL的表级差异和同步过程

时间:2010-03-10 09:46:25

标签: sql database tsql synchronization

我对用于将表(或可能是其子集)与来自另一个类似表的数据同步的T-SQL源代码感兴趣。这两个表可以包含任何变量,例如我可以有

 base table    source table 
 ==========    ============
 id     val    id       val
 ----------    ------------
 0        1    0          3
 1        2    1          2
 2        3    3          4

 base table             source table 
 ===================    ==================
 key    val1    val2    key   val1    val2
 -------------------    ------------------
 A         1       0    A        1       1  
 B         2       1    C        2       2
 C         3       3    E        4       0

或包含具有相似名称的类似列的任何两个表。我希望能够

  • 检查两个表是否有 匹配列:源表与基表具有完全相同的列,数据类型匹配
  • 从基表创建差异到源表
  • 执行必要的更新,删除和插入以更改数据 基表与源表对应
  • 可选择将diff限制为基表的子集

最好使用存储过程。有没有人为此写过存储过程,还是你指向一个来源?

3 个答案:

答案 0 :(得分:4)

SQL Server 2008具有新的merge statement功能。如果写出来有点复杂,那就非常灵活。

作为示例,以下查询将同步@base@source表。它仅限于@base的子集id <> 2

MERGE @base as tgt
USING @source as src
ON tgt.id = src.id and tgt.val = src.val
WHEN NOT MATCHED BY TARGET
    THEN INSERT (id, val) values (src.id, src.val)
WHEN NOT MATCHED BY SOURCE AND tgt.id <> 2
    THEN DELETE

答案 1 :(得分:1)

不确定它是否对您的特定情况有用,但这种操作通常使用外部工具(SQL Workbench diff,SQL Compare等)相对容易完成。 它甚至可以编写脚本,可能无法通过T-SQL过程调用。

答案 2 :(得分:1)

有趣的问题。

你可以从EXCEPT - INTERSECT

开始

http://msdn.microsoft.com/en-us/library/ms188055.aspx

这是现成的解决方案,可以帮到你

http://www.sqlservercentral.com/scripts/Miscellaneous/30596/