Первичный ключ на этой таблице - ваша отсрочка.Очевидно, что база данных SQL Server, в которую вы переносите разрозненные данные, не будет знать от одной таблицы к следующей, какие записи изменились, но если вы добавите две дополнительные таблицы и измените существующую таблицу с помощью дополнительного столбца,он должен быть в состоянии понять это, используя HASHBYTES .
В этом примере я назову новую таблицу SentRows
, но вы можете использовать более значимое имя на практике.Мы назовем новый столбец в старой таблице HashValue
.
Добавьте столбец HashValue
к вашей таблице как тип данных varbinary
.NOT NULL
.
Создайте таблицу SentRows
со столбцами для всех столбцов первичного ключа основной таблицы, плюс столбец HashValue
.
Создание таблицы RowsToSend
это структурно идентично вашей основной таблице, включая HashValue
.
. Измените ваши запросы, чтобы создать HashValue
, применив HASHBYTES
ко всем неключевым столбцам в таблице.(Это будет ужасно утомительно. Извините.)
Отправьте полный набор данных.
Теперь переместите все значения ключей и HashValue
s в таблицу SentRows
.Обрежьте основную таблицу.
При следующем извлечении сравните значения ключей и HashValue
s с SentRows
с новыми данными в основной таблице.
Соответствие первичного ключа + совпадение хэша = строка без изменений
Соответствие первичного ключа + несоответствие хэша = Обновленная строка
Первичный ключ во входящих данных, но отсутствует в существующем наборе данных= Новая строка
Первичный ключ не во входящих данных, а в существующем наборе данных = Удаленная строка
Извлеките все изменения, которые необходимо отправить в таблицу 'RowsToSend`.
Отправьте изменения из RowsToSend
.
Переместите значения ключей и HashValue
s в таблицу SentRows
.Обновите хэши для измененных значений ключей, вставьте новые строки и решите, как вы собираетесь обрабатывать удаления, если вам приходится иметь дело с удалениями.
Обрежьте таблицу SentRows
, чтобы подготовиться к завтрашнему дню.
Если вы хотите (и вы поблагодарите себя позже, если вы это сделаете), добавьте вычисляемый столбец в таблицу SentRows
со значением по умолчанию GETDATE()
, которое сообщит вам, когда была добавлена строка.
И понеслось.С тех пор ничего, кроме дельт.