在触发器中检查@@rowcount = 0 的目的?

Posted

技术标签:

【中文标题】在触发器中检查@@rowcount = 0 的目的?【英文标题】:Purpose of checking @@rowcount = 0 in a trigger? 【发布时间】:2013-01-17 08:33:24 【问题描述】:

我读过一本书,例如 Pro SQL Server 2008 关系数据库设计和实现 Lois Davidson,我在其中找到了检查触发器内的 @@rowcount 的建议:if it is = 0 then return

if @@rowcount = 0 return

我想知道是否修改了 no 行是如何触发触发器的?

【问题讨论】:

【参考方案1】:

触发器为正在运行的 语句 触发。即使表为空,或者语句不影响任何行,它也会触发:

create table tr (i int);
go

create trigger g on tr after update
as 
print 'foo'
go


update tr set i = 2

@Muflix 更新:

create table tr (i int);
go

create trigger g on tr after insert
as 
print 'foo'
go

insert into tr select * from tr;
go

正如您所见,即使没有插入任何行,触发器也会触发。

【讨论】:

在插入触发器中检查这一点也很重要?【参考方案2】:

因为Trigger 无法知道有多少行受到触发事件的影响,所以您必须检查内部。

【讨论】:

一个触发器可以做SELECT COUNT(*) FROM [inserted]虽然:docs.microsoft.com/en-us/sql/relational-databases/triggers/…【参考方案3】:

触发器被触发,因为触发事件已经发生。触发器不 检查有多少行受到影响。因此你必须检查@@rowcount 扳机体内。要触发触发器,触发事件很重要,并且 不是受影响的行数。

另请注意,当 SQL Server 2008 中的 MERGE 语句触发时,触发器中 @@rowcount 的行为与预期不同,并且有所不同。

【讨论】:

以上是关于在触发器中检查@@rowcount = 0 的目的?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 触发器在插入语句之前检查值

rowCount()始终返回0

C++上二维数组的大小

SQLAlchemy ResultProxy.rowcount 不应为零

PHP PDO Update语句总是返回0行受影响的rowCount()

在获取时检查行存在的最快方法是哪种?