문제

시스템에서 외부 시스템으로 데이터를 동기화 해야하는 프로젝트를 진행 중입니다. 내가 달성하고 싶은 것은 정기적으로 변경된 항목 (행) 만 사용자 정의 쿼리에서 보내는 것입니다. 이 쿼리는 다음과 같지만 더 많은 열이 있습니다.

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를 지원하는 경우 충돌이 적은 경향이 없음) 그러나 열 목록이나 체크섬의 방식이 아닌 Varchar 또는 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