0

在通用 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 语句来实现的东西,因为它是大型通用解决方案的一部分。我的手有点束缚。

我一直在考虑添加一个虚拟聚合函数来强制错误。但一直无法弄清楚如何做到这一点。

4

1 回答 1

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
于 2015-01-12T10:04:13.350 回答