Как работает SQL Server MERGE
?Что контролирует порядок операций INSERT, UPDATE и DELETE в операторе SQL MERGE?
Если выполняется несколько операций (INSERT
, UPDATE
, DELETE
), то что контролирует порядок выполнения этих операций?
Как работает SQL Server MERGE
?Что контролирует порядок операций INSERT, UPDATE и DELETE в операторе SQL MERGE?
Если выполняется несколько операций (INSERT
, UPDATE
, DELETE
), то что контролирует порядок выполнения этих операций?
От MSDN:
Для каждой вставки, обновления или удаления действия, указанные в операторе MERGE , SQL Server запускает любые соответствующие ПОСЛЕ триггеров определяется на целевой таблице, но не гарантирует, на которые распространяется действие для запуска триггеры сначала или в последний раз.
Если я правильно понял документацию, SQL Server не гарантирует никакого заказа. Он выполнит ваш запрос по своему усмотрению.
Не эта цитата относится к тому, как SQL обрабатывает любые триггеры в целевых таблицах, которые на них выполняются 'MERGE', а не как' 'MERGE' обрабатывает' INSERT', 'UPDATE' и 'DELETE'? – 3N1GM4
Да, это хороший момент. Я не мог думать ни о какой другой причине, почему заказ будет иметь значение. Для большинства целей вы можете рассматривать его как одну операцию. Но если ваш db содержит беспорядок триггеров спагетти * возможно, порядок выполнения может быть важным. В любом случае, я думаю, что ваш комментарий по первому вопросу является лучшим ответом. –
Отметьте documentation за MERGE
согласно моему комментарию.
В инструкции MERGE
вы указываете, как сопоставлять записи между исходными и целевыми таблицами и какие действия следует выполнять, когда есть (или нет) совпадение. Это поэтому определяет, какие записи являются INSERT
ed, которые являются UPDATE
ed и которые являются DELETE
d.
Посмотрите на пример из приведенной выше странице документации:
MERGE Production.UnitMeasure AS target
USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)
ON (target.UnitMeasureCode = source.UnitMeasureCode)
WHEN MATCHED THEN
UPDATE SET Name = source.Name
WHEN NOT MATCHED THEN
INSERT (UnitMeasureCode, Name)
VALUES (source.UnitMeasureCode, source.Name)
OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;
Здесь они соответствующие записи на target.UnitMeasureCode = source.UnitMeasureCode
и где есть совпадение, они обновляют целевую запись со значением Name
от источника , Если нет совпадения, они вставляют новую запись в целевую таблицу, используя значения из исходной записи.
Вы прочитали [документацию] (https://msdn.microsoft.com/en-us/library/bb510625.aspx) для 'MERGE'? В синтаксисе вашего заявления вы указываете, какие действия следует предпринять при каких условиях, исходя из того, какие критерии соответствия. Прочитайте и попытайтесь сделать все, что вы пытаетесь сделать, а затем вернитесь, если у вас есть конкретные проблемы или вопросы. – 3N1GM4