Вставьте затронутые строки во временную таблицу перед вставкой с помощью оператора слияния SQL Server 2008 R2 - PullRequest
0 голосов
/ 04 июня 2018

Я создал следующий оператор MERGE, и он работает как положено.

К сожалению, мне нужно изменить этот оператор слияния из-за нового требования.Перед вставкой / обновлением / удалением с помощью оператора MERGE мне нужно записать строки в третью таблицу.После проверки пользователями я могу отправить свои изменения в таблицу TARGET.

Возможно ли это с помощью оператора MERGE?

MERGE INTO LARBI_Dim AS TARGET
USING (SELECT *  
       FROM #LARBI_Dim_view) AS SOURCE ON  SOURCE.RefLeaseAssumptionID = TARGET.RefLeaseAssumptionID

WHEN NOT MATCHED BY TARGET
   THEN         
      INSERT ([RefLeaseAssumptionID], isLinkedFlag, isExtendedFlag)
      VALUES (SOURCE.[RefLeaseAssumptionID], SOURCE.isLinkedFlag, SOURCE.isExtendedFlag)

WHEN MATCHED AND
        (SOURCE.isLinkedFlag <>  TARGET.isLinkedFlag
         OR SOURCE.isExtendedFlag <>  TARGET.isExtendedFlag)
   THEN
      UPDATE
         SET TARGET.isLinkedFlag = SOURCE.isLinkedFlag,
             TARGET.isExtendedFlag = SOURCE.isExtendedFlag

WHEN NOT MATCHED BY SOURCE
   THEN
      DELETE

OUTPUT $ACTION,
    getdate() as 'ChangedDate',
    Isnull(inserted.[RefLeaseAssumptionID], deleted.[RefLeaseAssumptionID]) as 'RefLeaseAssumptionID',
    CASE WHEN $ACTION = 'UPDATE' AND inserted.isLinkedFlag <> deleted.isLinkedFlag
        THEN cast(deleted.isLinkedFlag as varchar(30)) + '-->' + cast(inserted.isLinkedFlag as varchar(30))
        END as 'isLinkedFlag',

    CASE WHEN $ACTION = 'UPDATE' AND inserted.isExtendedFlag <> deleted.isExtendedFlag
        THEN cast(deleted.isExtendedFlag as varchar(30)) + '-->' + cast(inserted.isExtendedFlag as varchar(30))
        END as 'isExtendedFlag'

        ;
...