0

换句话说,如果我有一个调用 proc 的触发器;我应该能够检查@@rowcountproc 的第一行吗?并且应该@@rowcount有一个基于触发器中执行的最后一条 SQL 语句的值?

我正在调试一个我没有编写的过程。proc的第一行是

if @@rowcount=0
RETURN

proc 由触发器调用。触发器在调用 proc 之前所做的最后一件事是:

INSERT INTO #temp_table (some fields...)
SELECT some fields.. FROM inserted

EXEC SOMEPROC

发生的事情是@@rowcount在 proc 中始终为 0,并且 proc 在它做任何事情之前就结束了。修复非常简单,我只需将@@rowcount检查移入触发器并将其从 proc 中取出。

但是我很好奇为什么它首先是这样写的。几乎就像它曾经在某个时候工作一样,现在却不行了?我只是想检查一下 SQL2005 和 SQL2008 之间的行为是否发生了一些变化,或者某些系统设置发生了翻转。还是我的一位前任只是编写了从未工作过的糟糕代码?

4

1 回答 1

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
  ...
于 2012-02-07T22:04:27.627 回答