2012-02-08 20 views
0

私は4つのデータソース間で統合しています:直接フィールド比較の代わりにフィールドのハッシュを使用してレコードの比較を簡単にすることはできますか?

InternalDeviceRepository 
ExternalDeviceRepository 
NightlyDeviceDeltas 
MidDayDeviceDeltas 

変更は、他の三つの情報源からInternalDeviceRepositoryに流れ込みます。 すべてのソースは最終的に

FIELDS 
============= 
IdentityField 
Contract 
ContractLevel 
StartDate 
EndDate 
ContractStatus 
Location 

IdentityFieldが主キーであるの定義を持つように変換され、契約鍵はそう新しいレコードを作成する必要があり、一致が存在する場合にのみ、二次キーです。

現在、SQLステートメントのWHERE句のすべてのフィールドと、SSISパッケージのいくつかの場所を比較しています。これにより、見栄えのよいSQLとSSISパッケージが作成されます。

私はContractLevel、StartDate、EndDate、ContractStatus、Locationのハッシュを計算し、各入力テーブルに追加しています。これにより、毎回5つの別々の値の代わりに、比較のために単一の値を使用することができます。

私は以前これをやったことがなく、私はそれが完了したことを見たことがありません。それを使用すべき理由はありますか、それを行うためのよりクリーンな方法ですか?

答えて

1

これは有効なアプローチです。ハッシュとインデックスを持つ計算フィールドを導入することを検討してください。

あなたはどちらかCHECKSUM機能を使用するか、このような独自のハッシュ関数を書くことがあります。

CREATE FUNCTION dbo.GetMyLongHash(@data VARBINARY(MAX)) 
RETURNS VARBINARY(MAX) 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
    DECLARE @res VARBINARY(MAX) = 0x 
    DECLARE @position INT = 1, @len INT = DATALENGTH(@data) 

    WHILE 1 = 1 
    BEGIN 
     SET @res = @res + HASHBYTES('MD5', SUBSTRING(@data, @position, 8000)) 
     SET @position = @position+8000 
     IF @Position > @len 
      BREAK 
    END 
    WHILE DATALENGTH(@res) > 16 SET @res= dbo.GetMyLongHash(@res) 
    RETURN @res 
END 

あなたに16バイトの値を与えるであろう - あなたは、GUID、または8最初だけなど、すべての16のバイトがかかる場合がありますバイトをbigintとして比較して比較します。

あなたの方法で機能を適応 - パラメータとして文字列を受け入れる、あるいは、すべてのフィールドをする代わりにvarbinary型の

しかし

  • 場合、日時フォーマット
  • 文字列のケースに注意してくださいCHECKSUMを使用する - 他のフィールドもチェックすると、チェックサムは集計を生成する
  • 4バイトのハッシュ結果を使用することは避けてください。
+0

興味深いアプローチ - これを複数のフィールドにどのように適用しますか?ありがとう。 –

+0

フィールドを常に連結し、結果を関数に渡すことができます –

関連する問題