Sql server 合并中使用的校验和?

Sql server 合并中使用的校验和?,sql-server,merge,checksum,Sql Server,Merge,Checksum,我们有一个开发人员去年离开了我们…他是一个伟大的开发人员!作为一名DBA,我非常喜欢他加入团队! 但我从他那里发现了一段代码: when matched and checksum(TARGET.Lead_ID, TARGET.Salesforce_id) <> checksum(SOURCE.Lead_ID,SOURCE.Salesforce_id) or checksum(TARGET.Le

我们有一个开发人员去年离开了我们…他是一个伟大的开发人员!作为一名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)
当匹配和
校验和(TARGET.Lead\u ID,TARGET.Salesforce\u ID)校验和(SOURCE.Lead\u ID,SOURCE.Salesforce\u ID)
或校验和(TARGET.Lead\u ID,TARGET.CreatedById)校验和(SOURCE.Lead\u ID,SOURCE.CreatedById)
或校验和(TARGET.Lead\u ID,TARGET.Email)校验和(SOURCE.Lead\u ID,SOURCE.Email)
或校验和(TARGET.Lead\u ID,TARGET.LastModifiedById)校验和(SOURCE.Lead\u ID,SOURCE.LastModifiedById)
或校验和(TARGET.Lead_ID,TARGET.ConvertedContactId)校验和(SOURCE.Lead_ID,SOURCE.ConvertedContactId)
或校验和(TARGET.Lead\u ID,TARGET.ConvertedDate)校验和(SOURCE.Lead\u ID,SOURCE.ConvertedDate)
或校验和(TARGET.Lead\u ID,TARGET.convertedoportunityid)校验和(SOURCE.Lead\u ID,SOURCE.convertedoportunityid)
或TARGET.IsConverted SOURCE.IsConverted
或校验和(TARGET.Lead\u ID,TARGET.Mini\u West\u Local\u Marketing\u c)校验和(SOURCE.Lead\u ID,SOURCE.Mini\u West\u Local\u Marketing\u c)
或校验和(TARGET.Lead\u ID,TARGET.Valid\u Leads\u c)校验和(SOURCE.Lead\u ID,SOURCE.Valid\u Leads\u c)
或校验和(TARGET.Lead\u ID,TARGET.FE\u Owner\u c)校验和(SOURCE.Lead\u ID,SOURCE.FE\u Owner\u c)
或校验和(TARGET.Lead\u ID,TARGET.FE\u Sales\u Group\u c)校验和(SOURCE.Lead\u ID,SOURCE.FE\u Sales\u Group\u c)
我知道校验和:“返回在表的一行或表达式列表上计算的校验和值。校验和用于构建哈希索引。”

但是,他为什么要在那里使用它呢


注意:(这是代码的一部分,真正的'when matched'子句有100列,源和目标都有100列…

我最好的猜测是他试图“快速”检测更改,同时避免
NULL
语义

不太清楚为什么他在使用(
存在
+
除了
)或(
不存在
+
相交
)时会这样写,似乎在没有N个分支和N*2
校验和
操作的情况下完成相同的结果:

when matched
 and exists (
         select [SOURCE].[Lead_ID]
              , [SOURCE].[Salesforce_id]
              , [SOURCE].[CreatedById]
              , ...
         except
         select [TARGET].[Lead_ID]
              , [TARGET].[Salesforce_id]
              , [TARGET].[CreatedById]
              , ...
     )

谢谢Kittoes0124!我认为你是对的,但更重要的是…我们用于合并的源代码是:“From SourceTable Where UpdateDate>@LastUpdateDate”…因此不需要做任何检查:如果一条记录被提取并匹配,那是因为它在源代码中被更新了…我将它更改为“匹配时再更新”…我可能缺少任何潜在的问题/警告?我将完全依赖于在源代码处正确使用UpdateDate。@Chicago1988,如果您确定无需执行检查,则不要执行。如果您已经在流程的早期部分使用了CPU周期,那么现在浪费CPU周期是没有意义的。我使用
exists
/
除了
模式,仅在我不知道传入值是否不同的情况下,并且我希望避免由于某种原因(审核、大小)而改变未更改的列。