#sql-server #sql-server-2008
#sql-сервер #sql-server-2008
Вопрос:
Вместо того, чтобы использовать кучу инструкций or для проверки того, была ли изменена строка, я просматривал checksum() или binary_checksum(). Что является наилучшей практикой в этой ситуации? Используется ли контрольная сумма (), binary_checksum() или какой-либо другой метод? Мне нравится идея использования одного из параметров контрольной суммы, поэтому мне не нужно создавать массивную инструкцию or для моего обновления.
РЕДАКТИРОВАТЬ: Извините всех, я должен был предоставить более подробную информацию. Мне нужно получить данные из некоторых внешних источников, но поскольку я использую репликацию слиянием, я не хочу просто удалять и перестраивать таблицы. Я хочу обновлять или вставлять только те строки, которые действительно имеют изменения или не существуют. У меня будет сопряженная версия исходных данных в моей целевой базе данных, которая будет синхронизирована с клиентами. Я пытался найти хороший способ обнаружить изменения в строке без необходимости просматривать каждый отдельный столбец для выполнения обновления.
Приветствуются любые предложения.
Спасибо,
S
Комментарии:
1. Не могли бы вы описать сложившуюся ситуацию чуть более подробно?
2. Для чего это? Слияние или оптимистичный параллелизм?
3. имейте в виду, что вы можете использовать контрольную сумму или binary_checksum, чтобы определить, что две строки определенно отличаются, но вы не можете использовать это, чтобы подтвердить, что они в точности одинаковы — могут быть два набора значений, которые отличаются, но возвращают одну и ту же контрольную сумму — так что здесь все еще может быть некоторая серая область.
4. @Damien_The_Unbeliever таким образом, я действительно мог бы генерировать некоторые обновления для записей, которые действительно одинаковы, если я использую контрольную сумму ()
5. @scarpacci — наоборот — вы можете считать, что две строки одинаковы (потому что они имеют одинаковое значение контрольной суммы), когда на самом деле они разные.
Ответ №1:
Во-первых, если вы используете фактическую репликацию слиянием, она должна позаботиться об обновлении соответствующих строк для вас.
Во-вторых, обычно способ определить, изменилась ли строка, заключается в использовании столбца с типом данных timestamp
, который теперь называется rowversion
, который изменяется при каждом обновлении строки. Однако этот тип столбца покажет вам, изменилось ли значение с момента последнего чтения значения, что означает, что вы должны были прочитать и сохранить временные метки для использования в сравнении. Таким образом, это может у вас не сработать.
Наконец, решением, которое может сработать для вас, могут быть триггеры в рассматриваемой таблице, которые обновляют фактический DateTime
(или, что еще лучше, DateTime2
) столбец с текущей датой и временем, когда выполняется вставка. Для вашего сравнения потребуется сохранить дату и время, которые вы в последний раз синхронизировали с таблицей, и сравнить эту дату и время в последнем обновленном столбце, чтобы определить, какие строки изменились.
Ответ №2:
Может помочь, если у нас будет немного больше информации о том, что вы делаете, но в целом опция checksum () работает хорошо, пока у вас есть доступ к исходной контрольной сумме строки для сравнения.