【问题标题】:Synchronizing 2 tables with MERGE使用 MERGE 同步 2 个表
【发布时间】:2013-01-29 08:39:51
【问题描述】:

我的任务是同步 2 个表(两者都是相同的)。它们每个有 60 列。表 A 是最初将被填充的主表。我需要创建一个存储过程(完成),它将合并这两个表并在调用时使用相同的确切数据(更新、插入、删除)填充两者。我将如何使用 SQL 中的 MERGE 函数来实现这一点?我查看了 MSDN 文档和 technet 上的类似文档,但我对入门感到很困惑。我是否需要指定需要合并的每个字段?还是我遗漏了一个简单的调用来执行此操作?

【问题讨论】:

  • 正确,我想同步两个表...从我的研究看来,MERGE 是我想要使用的。我可能是错的,我只是还没有看到任何包含超过 60 列的表的示例。我只是总体上混淆了从哪里开始......我是一名 C# 开发人员,正在走出我的舒适区......
  • @Sarel:如果你愿意,你可以删除 cmets ;)

标签: sql sql-server merge


【解决方案1】:

这里是一个简单的 MERGE 语句示例的链接:

http://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/

基本语法如下:

MERGE table1
USING table2
ON table1.id = table2.id
WHEN MATCHED THEN
--Do an update here
WHEN NOT MATCHED BY TARGET THEN
--Do an insert here (or a delete)
;

你也可以使用WHEN NOT MATCHED BY SOURCE

【讨论】:

  • 这帮助我完成了任务!与我使用的最后一种方法相比,不仅帮助而且将同步时间缩短了 1 小时以上!!
  • @twoleggedhorse 你能告诉我这种合并语句技术对于一个不断变化的大型数据库来说已经足够了,我们需要同步它
  • @twoleggedhorse 或者这对于大型数据库有一些缺点,还有其他更好的解决方案吗?
  • @twoleggedhorse 数据库也应该每秒同步一次,这将是两种方式,意味着两个数据库都应该匹配
【解决方案2】:

超过 60 列是一个很大的数字!当我需要同步 2 个相同的表时,我会这样做:

;WITH tbl_to_synch as (
    -- Prepare table to update,
    Select *,chk = CHECKSUM(*) from [dbo].[tableA]
)
MERGE tbl_to_synch as [Target]
USING (Select *,chk = CHECKSUM(*) from [dbo].[tableB]) as [source]
ON [Target].key = [source].key
WHEN MATCHED AND [Target].chk <> [source].chk THEN 
-- UPDATE ONLY row that is changed
UPDATE
    SET 
        column01 = [source].[column01]
        ,column02 = [source].[column01]
        -- .... 
        ,column59 = [source].[column59]
        ,column60 = [source].[column59]

WHEN NOT MATCHED BY TARGET THEN
    insert (column01, column02, ...,column59,column60)
    values (column01, column02, ...,column59,column60)
WHEN NOT MATCHED BY SOURCE THEN DELETE
-- Show what is changed
OUTPUT $action, ISNULL(INSERTED.key,DELETED.key);

【讨论】:

  • 喜欢使用 CTE 来定义目标表。可以在具有 WHEN NOT MATCHED BY SOURCE 的 MERGE 语句上获得巨大的速度提升。有关更多信息,请参阅我在 stackoverflow.com/questions/7626719/… 上的回答
  • 这就是我一直在寻找的答案!我喜欢检查哈希而不是每个单独的值。完美
猜你喜欢
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多