插入和删除的记录计数在更新触发器中是否总是相等?

时间:2014-10-16 22:29:30

标签: sql sql-server tsql

我有一个更新触发器,其中包含以下代码:

declare @numrows  int       
select @numrows = @@rowcount

if @numrows <> 1
    return

在某些情况下@numrows会返回0,即使行数为1.我认为这是因为select会重置行数吗?无论如何,我用这个替换它:

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

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

2 个答案:

答案 0 :(得分:2)

我不能像史蒂夫在他的回答中那样评论MERGE,但如果在桌子上运行UPDATE

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

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

答案 1 :(得分:1)

他们不平等。请记住,像MERGE这样的很好的功能可以在一个事务中INSERT / UPDATE / DELETE,只需调用一次触发器。

修改

在做了一些测试之后,我对MERGE如何工作的理解是错误的。它们将是单独的触发事件。每个操作一个INSERT / UPDATE / DELETE。

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

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

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