一般的な ETL フローでは、ソース (テーブル、ファイル、Web サービスなど) からデータマートにデータを選択しています。
行が変更されたかどうかを識別するために、MS-SQL hashbyte-function を使用しています。
たとえば、主キー = CountryCode および Zip を持つ CountryCode、Zip および CityName を持つ都市テーブルで
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 で使用される副選択には両方の列が含まれ、両方の行に同じハッシュキーが含まれます。したがって、データマートが正しく更新されません。さらに、ソースに重複があることは通知されません。
結果の例:
Zip CountryCode CityName SysCheckSumSCD1
14600 FR Honfleur 6D8EF511B35621FC0F5CC67AA6B98EEA
14600 FR Equemauville 6D8EF511B35621FC0F5CC67AA6B98EEA
代わりに、呼び出しを失敗させたいと思います。
以前、実際の行を入力として取り、上記の例で失敗した CHECKSUM 関数を使用しました。しかし、残念ながら文字列のみを入力として受け取る HASHBYTES に変更する必要がありました。「FOR XML RAW」部分の理由はどれですか
有益な情報をいただければ幸いです。それは大規模な汎用ソリューションの一部であるため、上記の SQL ステートメントを変更するだけで実装できる望ましいものです。そして、私の手は少し縛られています。
エラーを強制するためにダミー集計関数を追加することを考えていました。しかし、それを行う方法を理解することができませんでした。