Подтвердить что ты не робот

При использовании нескольких инструкций WHEN MATCHED, все они выполняются или выполняется только один?

Если у меня есть несколько операторов WHEN MATCHED в операторе MERGE, выполняются ли все они, если они верны?

Мой пример:

DECLARE @X bit = NULL;

--skipping the MERGE statement, straight to WHEN MATCHED

WHEN MATCHED AND A = 1
    @X = 0;
WHEN MATCHED AND B = 1
    @X = 1;

Каково состояние X в каждой из четырех возможностей?

A|B|X
0|0|?
0|1|?
1|0|?
1|1|?

В принципе, мне любопытно, есть ли неявный BREAK после каждого предложения WHEN MATCHED.

4b9b3361

Ответ 1

Чтобы ответить на ваш вопрос, да, он будет запускать только одно совпадение, а затем перерыв. Однако, если вы хотите иметь логику для условного соответствия в обновлении, инструкция CASE полезна для этого.

Что-то вроде этого в качестве примера:

MERGE INTO YourTable
USING (VALUES (1, 1, NULL), (0, 0, NULL), (0, 1, NULL), (1, 0, NULL))
       T2 (a2,b2,c2)
ON a = a2 AND b = b2
WHEN MATCHED  THEN
    UPDATE SET c = 
      CASE 
        WHEN a = 1 THEN 0
        WHEN b = 1 THEN 1
        ELSE NULL
      END        
WHEN NOT MATCHED THEN
    INSERT (a, b) VALUES (a2, b2);

SELECT * FROM YourTable ORDER BY a,b;

И результаты:

A   B   C
--------------
0   0   (null)
0   1   1
1   0   0
1   1   0

Ответ 2

Я нашел в документацию MSDN:

КОГДА СОГЛАСНО ТОГДА

Указывает, что все строки target_table, которые соответствуют строкам, возвращаемым ON, и удовлетворяют любым дополнительным условиям поиска, обновляются или удаляются в соответствии с предложением.

В заявлении MERGE может быть не более двух условий WHEN MATCHED. Если указаны два предложения, то первое предложение должно сопровождаться предложением И. Для любой заданной строки второе предложение WHEN MATCHED применяется только в том случае, если первое не является. Если есть два предложения WHEN MATCHED, то необходимо указать действие UPDATE и указать действие DELETE. Если в предложении указано UPDATE, и более одной строки соответствует строке в target_table на основе, SQL Server возвращает ошибку. Оператор MERGE не может обновлять одну и ту же строку более одного раза или обновлять и удалять одну и ту же строку.

Итак, похоже, что выполняется только одно из операторов, и они требуют DELETE в одном и UPDATE в другом.

Ответ 3

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

Вопрос, следовательно, вы хотите получить производительность? если да, убедитесь, что у вас есть индексы, охватывающие

КОГДА MATCHED TARGET.FIELD1 = ИСТОЧНИК: FIELD1 И TARGET.FIELD2 = ИСТОЧНИК: FIELD2...

если вам не нужно курсор над вашими обновлениями после слияния с помощью триггера INSTEAD OF...

Не подходит для скорости, однако может работать, если вам нужно записать, кто что сделал...

Счастливое кодирование

Вальтер