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

时间:2013-10-16 19:21:44

标签: c# change-tracking

我有3张桌子:

  1. 暂存:每个月都会插入员工记录。
  2. Master:table包含所有先前从暂存,唯一记录中输入的记录。
  3. 更改:跟踪所有更改 - 没有主键。
  4. 表格有10列。在临时表中,每个月我们有大约2,500,000条记录。使用游标我可以将新记录从登台插入主表。

    当涉及到更新时,我使用内部联接来获取主表中已存在的暂存记录。

    要查明是否有任何员工信息发生了变化,我是否必须查询以下内容:

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

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

2 个答案:

答案 0 :(得分:1)

如果两个表确实相同,您可以在每个表中创建一个persisted computed column,表示整行的校验和(请参阅http://technet.microsoft.com/en-us/library/ms189788.aspx),在其上创建索引,然后使用该表为了你的加入。

答案 1 :(得分:1)

对数百万行使用光标听起来并不好玩。

也许你应该看看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
          )