Получите бесплатный хэш для конкретного запроса или представление с 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, которые менее подвержены столкновениям), но он принимает только 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