Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 MERGE ... WHEN MATCHED ... UPDATE - в 2-х экземплярах  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Подскажите, пожалуйста, можно ли как-то сделать два WHEN MATCHED ... UPDATE в MERGE (в 2008-м это типа запрещено)

Смысл:
если совпадает по ключевому полю то:
если НЕ совпадают дополнительные поля, то обновляем дополнительные поля (все разом, даже не заморачиваясь на каждое)
если дополнительные поля СОВПАДАЮТ, то обновляем поле-подтверждения

Напрямую по хелпу сделать не удалось (типа, два WHEN MATCHED AND ... UPDATE ... не возможно). Или как-то всё-таки можно?
Заранее спасибо.
--------------------------
No ROM Basic...

PS Как вариант - тупо апдейтить по when matched а потом разобрать результат OUTPUT - а и расставить признак апдейта ... Или прям в итоговой таблице завести колонку со значением 1/0 по условию совпадения соответствующих колонок из inserted и delited при $action = 'update' . Но тогда проще (и нагляднее для "потомков" ) сделать двумя командами... А хочется "одним махом"...
24 мар 16, 01:18    [18971282]     Ответить | Цитировать Сообщить модератору
 Re: MERGE ... WHEN MATCHED ... UPDATE - в 2-х экземплярах  [new]
iljy
Member

Откуда:
Сообщений: 8711
SIMPLicity_,

а в UPDATE поставить условие не? Типа

when matched then update set f1 = case when cond1 then expr1 else f1 end, f2 = case when cond2 then expr2 else f2 end

? Понимаю, что громоздко и коряво, зато действенно.
24 мар 16, 02:15    [18971351]     Ответить | Цитировать Сообщить модератору
 Re: MERGE ... WHEN MATCHED ... UPDATE - в 2-х экземплярах  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 594
SIMPLicity_,

См доку по MS MERGE

The MERGE statement can have at most two WHEN MATCHED clauses. If two clauses are specified, then the first clause must be accompanied by an AND <search_condition> clause. For any given row, the second WHEN MATCHED clause is only applied if the first is not. If there are two WHEN MATCHED clauses, then one must specify an UPDATE action and one must specify a DELETE action. If UPDATE is specified in the <merge_matched> clause, and more than one row of <table_source>matches a row in target_table based on <merge_search_condition>, SQL Server returns an error. The MERGE statement cannot update the same row more than once, or update and delete the same row.

Так что максимум 2 и с ограничениями, описанными выше.
24 мар 16, 10:30    [18971928]     Ответить | Цитировать Сообщить модератору
 Re: MERGE ... WHEN MATCHED ... UPDATE - в 2-х экземплярах  [new]
o-o
Guest
и даже понятно, почему именно 2.
WHEN MATCHED поддерживает 2 валидных действия, UPDATE и DELETE.
вот их и можно иметь обоих в WHEN MATCHED,
а не 2 апдэйта и не 2 делита.
так что дело не в 2008 и в хэлпе все правильно расписано, постом выше привели
24 мар 16, 11:43    [18972252]     Ответить | Цитировать Сообщить модератору
 Re: MERGE ... WHEN MATCHED ... UPDATE - в 2-х экземплярах  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 594
SIMPLicity_,

Внесите доп поля в список для match в дополнение к ключам.
Вариантов для WHEN NOT MATCHED [ BY TARGET ] может быть много, и таких ограничений к ним нет.
24 мар 16, 12:37    [18972583]     Ответить | Цитировать Сообщить модератору
 Re: MERGE ... WHEN MATCHED ... UPDATE - в 2-х экземплярах  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Вот здесь есть пример разруливания этой проблемы

http://stackoverflow.com/questions/4784701/merge-into-with-multiple-updates-and-inserts
24 мар 16, 13:10    [18972751]     Ответить | Цитировать Сообщить модератору
 Re: MERGE ... WHEN MATCHED ... UPDATE - в 2-х экземплярах  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Всем спасибо за участие!

Хелп про MERGE и раньше читал,- посему и вопрос задавал конкретно здесь.

Вариант со stackoverflow.com мне показался не тем, что мне хотелось бы.

Добавить больше полей в ON смысла нет.

В итоге переделал немого логику. Не так красиво, зато стало несколько отказоустойчивее. ;-)

PS С учётом перехода (плавного) на новый движок скуля (вариативность, - или как его там охарактеризовать),- можно было бы убрать ограничение на несколько апдейтов оставив контроль за логичностью непротиворечивостью действий на совести говнокодеров программистов ;-) ... Это так, ИМБО.
25 мар 16, 23:12    [18980202]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить