在通用ETL流程中,我從數據源中選擇數據(表,文件,web服務等)。使用'FOR XML RAW'避免多個行調用'HashBytes'
我正在使用MS-SQL hashbyte函數來確定行是否已更改。
E.g.在城市表COUNTRYCODE,郵編和城市名與主鍵= COUNTRYCODE和Zip
SELECT CountryCode, Zip, CityName,
CONVERT(VARCHAR(40), HASHBYTES('MD5',
(SELECT CityName FROM spo.City sub
WHERE sub.Zip = main.Zip
AND sub.CountryCode = main.CountryCode
FOR XML RAW)), 2) AS SysCheckSumSCD1
FROM spo.City main
我的問題是在源
重複的主鍵的狀態,然後在HASHBYTES使用的子查詢,將包括兩列和兩行都將具有相同的hashkey。因此,我的數據智能將不會正確更新。 此外,我不會被告知來源中有重複。
結果舉例:
Zip CountryCode CityName SysCheckSumSCD1
14600 FR Honfleur 6D8EF511B35621FC0F5CC67AA6B98EEA
14600 FR Equemauville 6D8EF511B35621FC0F5CC67AA6B98EEA
相反,我想調用失敗。
此前我使用了CHECKSUM函數,它將實際的行作爲輸入,並在上例中失敗。 但我不得不改變爲HASHBYTES,不幸的是它只接受一個字符串作爲輸入。這是'FOR XML RAW'部分的原因
我會很感激任何有用的輸入。 可以通過改變上面的SQL語句來實現,因爲它是大型通用解決方案的一部分。而且我的手有點束縛。
我一直在考慮添加一個虛擬聚合函數來強制錯誤。但一直未能弄清楚如何去做。