Можно ли написать несколько операторов, когда НЕ СООТВЕТСТВУЮТ?
MERGE <target_table> [AS TARGET]
USING <table_source> [AS SOURCE]
ON <search_condition>
WHEN MATCHED THEN
<merge_matched>
WHEN NOT MATCHED THEN
<merge_not_matched> -- ONE MORE INSERT STATEMENT ON OTHER TABLE
Use of
BEGIN
andEND
not working
Я не верю, что MERGE
позволит вам выполнять несколько операций.
Вы можете просто написать отдельные инструкции, используя exists. Это также имело бы то преимущество, что вам не пришлось бы иметь дело с опасностями слияния, потому что их много, серьезность зависит от версии sql.
@LukaszSzozda Это довольно крутой способ обойти это «ограничение» в MERGE
, но разве это не идет вразрез с намерением MERGE
? Если бы он был предназначен для выполнения нескольких операций, он позволил бы вам, по крайней мере, выполнить sproc. Но я тоже не думаю, что это позволяет вам это делать.
@Shawn INSERT OVER DML
- это просто расширение OUTPUT INTO clause
. С простым OUTPUT вы не можете контролировать, какие строки попадут во вторую таблицу. Используя OUTPUT
и обернув все слияние подзапросом, вы можете добавить фильтры / присоединиться к другой вкладке и так далее.
@LukaszSzozda Я понимаю, что он делает, и считаю, что это довольно круто. Я просто не уверен, для чего был предназначен MERGE
. Может быть более надежный способ выполнить апсерт в несколько таблиц. Особенно учитывая, что MERGE
может столкнуться с проблемами с блокировкой и резервным копированием. И особенно для тех, кто все еще использует <SQL2016. Это определенно то, на что мне стоит посмотреть и поиграть.
@Shawn Да, это было предназначено для этого демонстрация: A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement
that is not the immediate source of rows for an INSERT statement.
Нет, у вас не может быть BEGIN / END внутри слияния. Но вы можете использовать ВСТАВИТЬ НАД DML для вставки дополнительной записи в таблицу, которая не является частью источника / цели.