换句话说,如果我有一个调用proc的触发器;我应该能够在过程的第一行检查@@rowcount
吗? @@rowcount
是否应该根据触发器中执行的最后一个SQL语句获得一个值?
我正在调试一个我没写过的proc。 proc的第一行是
if @@rowcount=0
RETURN
触发器调用proc。触发器调用proc之前触发的最后一件事是:
INSERT INTO #temp_table (some fields...)
SELECT some fields.. FROM inserted
EXEC SOMEPROC
发生的事情是,proc中的@@rowcount
始终为0,并且proc在它执行任何操作之前结束。修复非常简单,因为我只需将@@rowcount
检查移动到触发器中并将其从proc中取出。
但它对我很好奇,为什么它首先以这种方式写成。几乎像以前在某些时候工作,现在它没有?我只是想检查一下,看看SQL2005和SQL2008之间的行为是否有一些变化,或者是否有一些系统设置被翻转。或者我的一位前任是否只编写了从未奏效的错误代码?
答案 0 :(得分:0)
我不想使用@@ROWCOUNT
来检查触发器的状态。过程中和其间的过多语句可以将其重置为0.
例如:
SELECT TOP (10) name FROM sys.objects;
SET ANSI_NULLS ON;
SELECT @@ROWCOUNT;
----
0
相反,我会检查inserted
/ deleted
伪表。因此,对于插入或更新触发器:
IF EXISTS (SELECT 1 FROM inserted)
BEGIN
...
对于删除触发器:
IF EXISTS (SELECT 1 FROM deleted)
BEGIN
...