Слияние T-SQL с несколькими параметрами в согласованном сценарии - PullRequest
0 голосов
/ 11 октября 2018

Так что я немного покопался на этом сайте и не стал играть в кости, за исключением оператора case для обновления двух столбцов в SQL Merge.У меня есть другая проблема.Можете ли вы сделать два варианта в согласованном сценарии?Я хочу сделать обновление и вставку в когда соответствует.Это возможно?Можете ли вы опубликовать пример?Моя конечная цель - обновить старую запись и вставить новую запись в целевую таблицу.

 Merge Table1 as targ
using Table2 as sour

on table1ID  = Table2ID 

When  MATCHED 

    Then  update col1 = sour.col2 

    Then insert (col1,col2,col3)
    values (sour.col1,sour.col2,sour.col3)

When Not Matched 

    Then insert (col1,col2,col3)
    values (sour.col1,sour.col2,sour.col3); 

1 Ответ

0 голосов
/ 11 октября 2018

Я обертываю свои MERGE операторы в транзакции при откате и проверяю вывод.Оператор MERGE также может быть последней частью CTE .Вы можете иметь несколько операторов UPDATE, INSERT и DELETE внутри MERGE с различными предложениями WHERE.

Примечание. В операторе слияния не может быть несколькострок на столбцы в соединении.

Код:

SET XACT_ABORT ON  --When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back.
BEGIN TRANSACTION;

    MERGE Table1 AS T
    USING Table2 AS S
        ON --<< Update the join to the correct unique key for the table (can't have duplicate rows)
            T.[col1] = S.[col1]
        AND T.[col2] = S.[col2]
        AND T.[col3] = S.[col3]
    WHEN NOT MATCHED BY TARGET -- AND 1=2 --<< you can include a where clause here
        THEN INSERT
        (
           [col1], [col2], [col3]
        )
        VALUES
        (
           S.[col1], S.[col2], S.[col3]
        )
    WHEN MATCHED  -- AND 1=2 --<< you can include a where clause here
        THEN UPDATE SET
          T.[col1] = S.[col1]
        , T.[col2] = S.[col2]
        , T.[col3] = S.[col3]
    --WHEN NOT MATCHED BY SOURCE -- AND 1=2 --<< you can include a where clause here
        --THEN DELETE
    OUTPUT @@SERVERNAME AS [Server_Name], DB_NAME() AS [Database_Name], $action, inserted.*, deleted.*;

ROLLBACK TRANSACTION;
--COMMIT TRANSACTION;

GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...