【问题标题】:Will inserted and deleted record count always be equal in an update trigger?在更新触发器中插入和删除的记录数是否总是相等的?
【发布时间】:2014-10-16 22:29:30
【问题描述】:

我有一个更新触发器,代码如下:

declare @numrows  int       
select @numrows = @@rowcount

if @numrows <> 1
    return

在某些情况下,即使行数为 1,@numrows 也会返回 0。我认为这是因为选择重置了行数?无论如何,我将其替换为:

set @numrows  = (select count(*) from inserted) 

稍后在触发器中,我同时使用了插入和删除的表记录。插入和删除的行数是否总是相等的,还是我需要单独检查它们?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    我不能像史蒂夫在他的回答中所说的那样评论 MERGE,但是如果在表上运行更新

    UPDATE TableA SET Column1 = "ABC" WHERE Column1 = "DEF"
    

    并且 TableA 上存在更新触发器,那么当触发器触发时,是的,每个 Inserted 和 Deleted 表中的记录数将相同,并且将等于受更新影响的行数运行的语句。

    【讨论】:

      【解决方案2】:

      他们不会相等。请记住,有一些不错的功能,例如 MERGE,可以在一个事务中进行插入/更新/删除所有操作,只需一次调用您的触发器。

      编辑:

      在进行更多测试后,我对 MERGE 工作原理的理解是错误的。它们将是单独的触发事件。每个操作插入/更新/删除一个。

      因此,我认为 INSERTED 和 DELETED 的计数相等并不意味着它们都是更新。更重要的是,如果您在两个表中都有任意数量的记录,则它是一个更新。因此,这将是您确定是否为更新的最快方法:

      IF EXISTS(SELECT TOP 1 1 FROM inserted) AND EXISTS(SELECT TOP 1 1 FROM deleted)
      

      我很高兴合并没有像我想象的那样工作,因为我的触发器(使用上面的代码)会失败。

      【讨论】:

      • 我知道合并可能会导致多个触发器触发并弄乱@@rowcount。但是 MERGE UPDATE 的插入和删除表是否仍然遵循与常规 UPDATE 相同的规则?
      • 如果我的 MERGE 导致 1 次插入和 1 次删除(不是更新),触发器将被调用一次,其中 1 次插入和 1 次删除。
      • 嗯,不是根据 MSDN。我将不得不再次测试!
      • @Sprockincat,我已经根据进一步的测试编辑了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 2011-02-27
      • 2011-05-05
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多