SQL Server 2008を使用した特定のクエリまたはビューのために衝突無料ハッシュを取得します

StackOverflow https://stackoverflow.com/questions/19841786

質問

私は、システムから外部システムにデータを同期する必要があるプロジェクトに取り組んでいます。私が達成したいのは、カスタムクエリから変更されたアイテム(行)のみを定期的に送信することです。このクエリは次のように見えます(ただし、さらに多くの列があります):

SELECT T1.field1,
    T1.field2,
    T1.field2,
    T1.field3,
    CASE WHEN T1.field4 = 'some-value' THEN 1 ELSE 0 END,
    T2.field1,
    T3.field1,
    T4.field1
FROM T1
INNER JOIN T2 ON T2.pk = T2.fk
INNER JOIN T3 ON T3.pk = T2.fk
INNER JOIN T4 ON T4.pk = T2.fk

すべてのフィールドを同期間で比較する必要がないようにしたいと思います。クエリからすべての行にハッシュを生成し、これを以前の同期からハッシュと比較できるという考えがありました。私はそれを知っています チェックサム 機能ですが、非常に衝突しやすく、変更を見逃す可能性があります。しかし、私は一時テーブルを作って使用できる方法が好きです CHECKSUM(*), 、これにより、メンテナンスが容易になります(クエリとチェックサムにフィールドを追加する必要はありません):

SELECT T1.field1,
    T1.field2,
    T1.field2,
    T1.field3,
    CASE WHEN T1.field4 = 'some-value' THEN 1 ELSE 0 END,
    T2.field1,
    T3.field1,
    T4.field1
INTO #tmp
FROM T1
INNER JOIN T2 ON T2.pk = T2.fk
INNER JOIN T3 ON T3.pk = T2.fk
INNER JOIN T4 ON T4.pk = T2.fk;

-- get all columns from the query, plus a hash of the row
SELECT *, CHECKSUM(*)
FROM #tmp;

気がついた ハッシュバイト 関数(衝突する傾向が低いSHA1、MD5をサポートしています)が、列またはVarbinaryのみを受け入れ、列のリストやチェックサムのような方法ではありません。クエリからすべての列をキャスト/変換する必要があることは...の痛みです。

私も気づきました データキャプチャを変更し、追跡を変更します SQL Serverの機能ですが、それらはすべて複雑で、私がやっていることに対してやり過ぎです。

だから私の質問:私の基準を満たすクエリまたは一時テーブルからハッシュを生成する他の方法はありますか?

そうでない場合は、この種の作業を達成する他の方法がありますか(クエリとの違いを同期するため)

役に立ちましたか?

解決

私は自分が望んでいたことを正確に行う方法を見つけました。 FOR XML 節:

SELECT T1.field1,
    T1.field2,
    T1.field2,
    T1.field3,
    CASE WHEN T1.field4 = 'some-value' THEN 1 ELSE 0 END,
    T2.field1,
    T3.field1,
    T4.field1
INTO #tmp
FROM T1
INNER JOIN T2 ON T2.pk = T2.fk
INNER JOIN T3 ON T3.pk = T2.fk
INNER JOIN T4 ON T4.pk = T2.fk;

-- get all columns from the query, plus a hash of the row (converted in an hex string)
SELECT T.*, CONVERT(VARCHAR(100), HASHBYTES('sha1', (SELECT T.* FOR XML RAW)), 2) AS sHash
FROM #tmp AS T;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top