Оператор Merge
не делает целевую таблицу копией исходной таблицы. Эта часть неверна.
Она обеспечивает более короткий способ записи условных операторов DML - insert
/ update
/ delete
- позволяя вам написать один оператор, который будет выполнять либо один (или любую комбинацию) из вышеприведенных операторов DML.
Однако, хотя Merge
записывается как один оператор за сценой SQL Сервер фактически выполняет его как серию утверждений - каждая его часть получает одно утверждение - и это может вызвать множество проблем у ничего не подозревающего пользователя.
Аарон Бертран опубликовал статью на эту тему, озаглавленную Будьте осторожны с SQL Серверным оператором MERGE - вы должны внимательно прочитать его перед использованием Merge
в SQL Сервере.
В большинстве случаев используется Merge
выполнить "upsert" - то есть - обновить записи, если они существуют, или вставить, если нет. Лучший, более безопасный шаблон для «upsert» на SQL сервере описан в ответе Аарона на на этот SO вопрос , и я настоятельно рекомендую использовать его над Merge
всякий раз, когда это возможно.