Проверьте, идентичны ли вставленные и удаленные таблицы в триггере SQL Server

Я написал триггер, чтобы сохранить историю обновлений в таблице. Работает хорошо. Однако я заметил, что иногда таблица обновляется с такими же точными значениями. Это эффективно не меняет таблицу, но запускает триггер, что приводит к дублированию строк в моей таблице истории.

Чтобы решить эту проблему, я хотел бы выполнить тело моего триггера только когда inserted а также deleted таблицы не идентичны.

Вот мой текущий триггер. Он состоит из MERGE и INSERT. Если inserted а также deleted таблицы идентичны, я не хочу ни MERGE, ни INSERT:

BEGIN
    DECLARE @yesterday date, @maxDate date
    SET @yesterday = DATEADD(DD, -1, GETDATE())
    SET @maxDate = '9999-12-31'

    MERGE dbo.tblHistory AS Target
    USING (SELECT * FROM inserted) AS Source 
       ON (Target.ID = Source.ID AND Target.EndDate = @maxDate)

    WHEN MATCHED AND Target.StartDate > @yesterday THEN
        DELETE

    WHEN MATCHED THEN
        UPDATE 
            SET Target.EndDate = @yesterday
    ;

    --Insert updated row into History here
END

Это кажется наиболее понятным и логичным способом сделать это. Однако я не уверен, что это наиболее эффективно.

1 ответ

Решение

Вы можете проверить, используя, кроме оператора, как показано ниже

  ;with cte
   as
   (SELECT * FROM inserted
    EXCEPT
    SELECT * FROM deleted
    union all
   SELECT * FROM deleted
    EXCEPT
    SELECT * FROM inserted
   )
select * from cte

if @@rowcount>0
begin
--rest of your query
end
Другие вопросы по тегам