SQL MERGE - при несоответствии вставки с использованием таблицы выбора - PullRequest
1 голос
/ 20 апреля 2020

Возможно ли, если не существует, я вставлю свои данные с помощью выбора? Я использую пользовательскую таблицу, к которой относится переменная @ProcessItem, чтобы вставить все несуществующее.

MERGE INTO EmpClearancePendingItems1 a
USING @ProcessItem b ON a.OnProcessItem = b.OnProcessItem
                     AND a.TranNo = @TranNo

WHEN MATCHED THEN
    UPDATE 
        SET a.Amount = b.Amount,
            a.Remarks = b.Remarks,
            a.IfOthers = b.IfOthers

WHEN NOT MATCHED BY TARGET THEN
    INSERT (UserID, OnProcessItem, Amount, Remarks, TranNo, IfOthers)
    VALUES (SELECT @ResignEmp, OnProcessItem, Amount, Remarks, @TranNo, IfOthers
            FROM @ProcessItem);

Ответы [ 2 ]

3 голосов
/ 20 апреля 2020

Так как большинство ваших значений в любом случае являются столбцами из исходной таблицы - я не вижу никакой причины, почему вам нужно SELECT в INSERT - просто попробуйте это:

WHEN NOT MATCHED BY TARGET THEN
    INSERT (UserID, OnProcessItem, Amount, Remarks, TranNo, IfOthers)
    VALUES (@ResignEmp, b.OnProcessItem, b.Amount, b.Remarks, @TranNo, b.IfOthers);
1 голос
/ 20 апреля 2020

Операция слияния выполняется построчно и согласно документации MSDN , только условие VALUES поддерживается для WHEN NOT MATCHED. Вы не нуждаетесь в предложении SELECT, а также, синтаксис также не поддерживает его.

[ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]  
        THEN <merge_not_matched> ]  


 <merge_not_matched>::=   {  
     INSERT [ ( column_list ) ]
         { VALUES ( values_list )  
         | DEFAULT VALUES }   }

Ниже будет достаточно:

INSERT (UserID, OnProcessItem, Amount, Remarks, TranNo, IfOthers)
    VALUES (@ResignEmp, OnProcessItem, Amount, Remarks, @TranNo, IfOthers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...