MERGE против удаления и вставки в select - PullRequest
0 голосов
/ 29 января 2020

Я смотрю на утверждение MERGE и не понимаю его смысла.

Поправьте меня, если я ошибаюсь, но в основном это делает целевую таблицу идентичной копией исходной таблицы.

Так не проще ли УДАЛИТЬ записи из 1 таблицы и просто ВСТАВИТЬ В ... ВЫБРАТЬ все строки из другой?

Что-то мне не хватает в эффективности MERGE?

1 Ответ

4 голосов
/ 29 января 2020

Оператор Merge не делает целевую таблицу копией исходной таблицы. Эта часть неверна.

Она обеспечивает более короткий способ записи условных операторов DML - insert / update / delete - позволяя вам написать один оператор, который будет выполнять либо один (или любую комбинацию) из вышеприведенных операторов DML.

Однако, хотя Merge записывается как один оператор за сценой SQL Сервер фактически выполняет его как серию утверждений - каждая его часть получает одно утверждение - и это может вызвать множество проблем у ничего не подозревающего пользователя.
Аарон Бертран опубликовал статью на эту тему, озаглавленную Будьте осторожны с SQL Серверным оператором MERGE - вы должны внимательно прочитать его перед использованием Merge в SQL Сервере.

В большинстве случаев используется Merge выполнить "upsert" - то есть - обновить записи, если они существуют, или вставить, если нет. Лучший, более безопасный шаблон для «upsert» на SQL сервере описан в ответе Аарона на на этот SO вопрос , и я настоятельно рекомендую использовать его над Merge всякий раз, когда это возможно.

...