检测两个表中记录之间的更改

本文关键字:之间 记录 两个 检测 | 更新日期: 2023-09-27 18:35:51

我有 3 个表:

  1. 暂存:每月插入员工记录。
  2. 主:表包含以前从暂存中输入的所有记录,唯一记录。
  3. 更改
  4. :跟踪所有更改 - 没有主键。

这些表有 10 列。在临时表中,我们每个月都有大约 2,500,000 条记录。使用游标,我可以将新记录从暂存插入到主表中。

在更新方面,我使用内部联接从主表中已存在的暂存中获取记录。

要了解是否有任何员工信息已更改,我是否必须查询以下内容:

WHERE Staging.FirstName <> Master.FirstName
   OR Staging.LastName <> Master.LastName
   OR ...

依此类推 10 列,还是有更简单的方法?

检测两个表中记录之间的更改

如果这两个表确实相同,则可以在每个表中创建一个持久计算列,该列表示整行的校验和(请参阅 http://technet.microsoft.com/en-us/library/ms189788.aspx),在此基础上创建一个索引,然后将其用于连接。

使用游标处理数百万行听起来并不有趣。

也许你应该看看 EXCEPT/MERGE

WITH NewAndChanged AS (
    SELECT Stage.Id
          ,Stage.Col1
          ,Stage.Col2
    FROM Stage
  EXCEPT
    SELECT Master.Id
          ,Master.Col1
          ,Master.Col2
    FROM Master
)
MERGE Master
USING NewAndChanged
      ON Master.Id = NewAndChanged.Id
WHEN MATCHED
     THEN UPDATE SET
         Col1 = NewAndChanged.Col1
        ,Col2 = NewAndChanged.Col2
WHEN NOT MATCHED
     THEN INSERT (
              Id
             ,Col1
             ,Col2
          )
          VALUES (
              NewAndChanged.Id
             ,NewAndChanged.Col1
             ,NewAndChanged.Col2
          )