检查SQL Server触发器中插入和删除的表是否相同

时间:2017-09-15 16:02:29

标签: sql sql-server tsql merge

我写了一个触发器来保存表中的更新历史记录。它运作良好。但是,我注意到有时会使用相同的确切值更新表。这实际上不会更改表但会触发触发器,从而导致我的历史记录表中出现重复的行。

要解决此问题,我只想在inserteddeleted表不相同时执行触发器的主体。

这是我当前的触发器。它由MERGE和INSERT组成。如果inserteddeleted表相同,我不想合并也不要插入:

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 个答案:

答案 0 :(得分:3)

您可以使用下面的<运算符

进行检查
  ;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