我有一个更新触发器,其中包含以下代码:
declare @numrows int
select @numrows = @@rowcount
if @numrows <> 1
return
在某些情况下@numrows会返回0,即使行数为1.我认为这是因为select会重置行数吗?无论如何,我用这个替换它:
set @numrows = (select count(*) from inserted)
稍后在触发器中我使用了insert和deleted表记录。插入和删除的行数是否总是相等,或者我需要单独检查它们吗?
答案 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)
我很高兴合并不会像我想象的那样工作,因为我的触发器(使用上面的代码)会失败。