@@ rowcount是否应该从触发器持续到proc的调用?

时间:2012-02-07 21:13:00

标签: sql-server-2008 stored-procedures triggers persist rowcount

换句话说,如果我有一个调用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之间的行为是否有一些变化,或者是否有一些系统设置被翻转。或者我的一位前任是否只编写了从未奏效的错误代码?

1 个答案:

答案 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
  ...