我有3张桌子:
表格有10列。在临时表中,每个月我们有大约2,500,000条记录。使用游标我可以将新记录从登台插入主表。
当涉及到更新时,我使用内部联接来获取主表中已存在的暂存记录。
要查明是否有任何员工信息发生了变化,我是否必须查询以下内容:
WHERE Staging.FirstName <> Master.FirstName
OR Staging.LastName <> Master.LastName
OR ...
依此类推10列,还是有更简单的方法?
答案 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
)