2016-10-28 105 views
1

去年,我們有一位開發者離開了我們......他是一個偉大的開發者!作爲一名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) 

我知道校驗:「返回,或在表達式列表上計算一個表中的行校驗和值。 CHECKSUM旨在用於構建散列索引。'。

但是,爲什麼他會在那裏使用它?

注:(這是代碼的一部分,真正的「當匹配」子句中有100列,源和目標有100列...)

回答

1

我最好的猜測是他試圖以「快速」檢測同時避免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] 
       , ... 
    ) 
+0

謝謝Kittoes0124!我認爲你是對的,但更多...我們正在使用的合併源是:「從SourceTable Where UpdateDate> @LastUpdateDate」...因此不需要做任何檢查:如果記錄被拉取並匹配,因爲它已經在源代碼中更新......我將它更改爲「當匹配時更新」......任何潛在的問題/警告我可能會丟失?我將完全依靠在源代碼中正確使用UpdateDate。 – Chicago1988

+0

@芝加哥1988如果你確實知道沒有必要執行檢查,那麼不要。如果您已經在流程的早期階段花費了CPU週期,那麼現在就沒有意義了。我只在不知道傳入值是否有差別的情況下才使用'exists' /'except'模式**和**我想避免因某種原因(審計,大小)對未更改的列進行變異。 – Kittoes0124