合并中使用的校验和?
checksum used in merge?
我们有一位开发人员去年离开了我们......他是一个很棒的人!作为一名 DBA,我非常喜欢他加入团队!
但是我从他那里看到了这段代码:
when matched and
checksum(TARGET.Lead_ID, TARGET.Salesforce_id) <> checksum(SOURCE.Lead_ID,SOURCE.Salesforce_id)
or checksum(TARGET.Lead_ID, TARGET.CreatedById) <> checksum(SOURCE.Lead_ID,SOURCE.CreatedById)
or checksum(TARGET.Lead_ID, TARGET.Email) <> checksum(SOURCE.Lead_ID,SOURCE.Email)
or checksum(TARGET.Lead_ID, TARGET.LastModifiedById) <> checksum(SOURCE.Lead_ID,SOURCE.LastModifiedById)
or checksum(TARGET.Lead_ID, TARGET.ConvertedContactId) <> checksum(SOURCE.Lead_ID,SOURCE.ConvertedContactId)
or checksum(TARGET.Lead_ID, TARGET.ConvertedDate) <> checksum(SOURCE.Lead_ID,SOURCE.ConvertedDate)
or checksum(TARGET.Lead_ID, TARGET.ConvertedOpportunityId) <> checksum(SOURCE.Lead_ID,SOURCE.ConvertedOpportunityId)
or TARGET.IsConverted <> SOURCE.IsConverted
or checksum(TARGET.Lead_ID, TARGET.Mini_West_Local_Marketing__c) <> checksum(SOURCE.Lead_ID,SOURCE.Mini_West_Local_Marketing__c)
or checksum(TARGET.Lead_ID, TARGET.Valid_Leads__c) <> checksum(SOURCE.Lead_ID,SOURCE.Valid_Leads__c)
or checksum(TARGET.Lead_ID, TARGET.FE_Owner__c) <> checksum(SOURCE.Lead_ID,SOURCE.FE_Owner__c)
or checksum(TARGET.Lead_ID, TARGET.FE_Sales_Group__c) <> checksum(SOURCE.Lead_ID,SOURCE.FE_Sales_Group__c)
我知道校验和:“returns 根据 table 的一行或表达式列表计算的校验和值。 CHECKSUM 旨在用于构建哈希索引。'.
可是,他为什么要在那里用呢?
注意:(这是代码的一部分,真正的'when matched'子句有100列,源和目标都有100列......)
我最好的猜测是他试图 "quickly" 检测变化,同时避免 NULL
语义。
不太确定为什么他会这样写,而使用 (EXISTS
+ EXCEPT
) 或 (NOT EXISTS
+ INTERSECT
) 似乎可以完成相同的任务没有 N 个分支和 N * 2 CHECKSUM
个操作的结果:
when matched
and exists (
select [SOURCE].[Lead_ID]
, [SOURCE].[Salesforce_id]
, [SOURCE].[CreatedById]
, ...
except
select [TARGET].[Lead_ID]
, [TARGET].[Salesforce_id]
, [TARGET].[CreatedById]
, ...
)
我们有一位开发人员去年离开了我们......他是一个很棒的人!作为一名 DBA,我非常喜欢他加入团队! 但是我从他那里看到了这段代码:
when matched and
checksum(TARGET.Lead_ID, TARGET.Salesforce_id) <> checksum(SOURCE.Lead_ID,SOURCE.Salesforce_id)
or checksum(TARGET.Lead_ID, TARGET.CreatedById) <> checksum(SOURCE.Lead_ID,SOURCE.CreatedById)
or checksum(TARGET.Lead_ID, TARGET.Email) <> checksum(SOURCE.Lead_ID,SOURCE.Email)
or checksum(TARGET.Lead_ID, TARGET.LastModifiedById) <> checksum(SOURCE.Lead_ID,SOURCE.LastModifiedById)
or checksum(TARGET.Lead_ID, TARGET.ConvertedContactId) <> checksum(SOURCE.Lead_ID,SOURCE.ConvertedContactId)
or checksum(TARGET.Lead_ID, TARGET.ConvertedDate) <> checksum(SOURCE.Lead_ID,SOURCE.ConvertedDate)
or checksum(TARGET.Lead_ID, TARGET.ConvertedOpportunityId) <> checksum(SOURCE.Lead_ID,SOURCE.ConvertedOpportunityId)
or TARGET.IsConverted <> SOURCE.IsConverted
or checksum(TARGET.Lead_ID, TARGET.Mini_West_Local_Marketing__c) <> checksum(SOURCE.Lead_ID,SOURCE.Mini_West_Local_Marketing__c)
or checksum(TARGET.Lead_ID, TARGET.Valid_Leads__c) <> checksum(SOURCE.Lead_ID,SOURCE.Valid_Leads__c)
or checksum(TARGET.Lead_ID, TARGET.FE_Owner__c) <> checksum(SOURCE.Lead_ID,SOURCE.FE_Owner__c)
or checksum(TARGET.Lead_ID, TARGET.FE_Sales_Group__c) <> checksum(SOURCE.Lead_ID,SOURCE.FE_Sales_Group__c)
我知道校验和:“returns 根据 table 的一行或表达式列表计算的校验和值。 CHECKSUM 旨在用于构建哈希索引。'.
可是,他为什么要在那里用呢?
注意:(这是代码的一部分,真正的'when matched'子句有100列,源和目标都有100列......)
我最好的猜测是他试图 "quickly" 检测变化,同时避免 NULL
语义。
不太确定为什么他会这样写,而使用 (EXISTS
+ EXCEPT
) 或 (NOT EXISTS
+ INTERSECT
) 似乎可以完成相同的任务没有 N 个分支和 N * 2 CHECKSUM
个操作的结果:
when matched
and exists (
select [SOURCE].[Lead_ID]
, [SOURCE].[Salesforce_id]
, [SOURCE].[CreatedById]
, ...
except
select [TARGET].[Lead_ID]
, [TARGET].[Salesforce_id]
, [TARGET].[CreatedById]
, ...
)