2016-12-22 2 views
0

Как работает SQL Server MERGE?Что контролирует порядок операций INSERT, UPDATE и DELETE в операторе SQL MERGE?

Если выполняется несколько операций (INSERT, UPDATE, DELETE), то что контролирует порядок выполнения этих операций?

+1

Вы прочитали [документацию] (https://msdn.microsoft.com/en-us/library/bb510625.aspx) для 'MERGE'? В синтаксисе вашего заявления вы указываете, какие действия следует предпринять при каких условиях, исходя из того, какие критерии соответствия. Прочитайте и попытайтесь сделать все, что вы пытаетесь сделать, а затем вернитесь, если у вас есть конкретные проблемы или вопросы. – 3N1GM4

ответ

0

От MSDN:

Для каждой вставки, обновления или удаления действия, указанные в операторе MERGE , SQL Server запускает любые соответствующие ПОСЛЕ триггеров определяется на целевой таблице, но не гарантирует, на которые распространяется действие для запуска триггеры сначала или в последний раз.

Если я правильно понял документацию, SQL Server не гарантирует никакого заказа. Он выполнит ваш запрос по своему усмотрению.

+0

Не эта цитата относится к тому, как SQL обрабатывает любые триггеры в целевых таблицах, которые на них выполняются 'MERGE', а не как' 'MERGE' обрабатывает' INSERT', 'UPDATE' и 'DELETE'? – 3N1GM4

+0

Да, это хороший момент. Я не мог думать ни о какой другой причине, почему заказ будет иметь значение. Для большинства целей вы можете рассматривать его как одну операцию. Но если ваш db содержит беспорядок триггеров спагетти * возможно, порядок выполнения может быть важным. В любом случае, я думаю, что ваш комментарий по первому вопросу является лучшим ответом. –

0

Отметьте 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 от источника , Если нет совпадения, они вставляют новую запись в целевую таблицу, используя значения из исходной записи.

 Смежные вопросы

  • Нет связанных вопросов^_^