2015-01-09 38 views
0

在通用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語句來實現,因爲它是大型通用解決方案的一部分。而且我的手有點束縛。

我一直在考慮添加一個虛擬聚合函數來強制錯誤。但一直未能弄清楚如何去做。

回答

0

週末後帶着充電的大腦回到鍵盤後。我意識到解決方案其實很簡單。

只需通過在其周圍添加'SELECT()AS FOO')將語句傳遞給HASHBYTES子查詢。 : - |

因此,聲明將如下所示。

SELECT CountryCode, Zip, CityName, 
CONVERT(VARCHAR(40), HASHBYTES('MD5', 
    (SELECT 
     (SELECT CityName 
     FROM spo.City sub 
     WHERE sub.Zip = main.Zip 
     AND sub.CountryCode = main.CountryCode) AS FOO 
    FOR XML RAW)), 2) AS SysCheckSumSCD1 
FROM spo.City main