在通用 ETL 流程中,我将数据从源(表、文件、Web 服务等)选择到数据集市中。
我正在使用 MS-SQL 哈希字节函数来识别行是否已更改。
例如,在带有 CountryCode、Zip 和 CityName 的城市表上,主键 = 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 语句来实现的东西,因为它是大型通用解决方案的一部分。我的手有点束缚。
我一直在考虑添加一个虚拟聚合函数来强制错误。但一直无法弄清楚如何做到这一点。