Sql server 2008 @rowcount是否应该从触发器持续到其调用的进程中?

Sql server 2008 @rowcount是否应该从触发器持续到其调用的进程中?,sql-server-2008,stored-procedures,triggers,persist,rowcount,Sql Server 2008,Stored Procedures,Triggers,Persist,Rowcount,换句话说,如果我有一个调用proc的触发器;我应该能够检查进程第一行中的@@rowcount吗?@rowcount是否应该有一个基于触发器中执行的最后一个SQL语句的值 我正在调试一个我没有编写的进程。程序的第一行是 if @@rowcount=0 RETURN 该过程由触发器调用。触发器在调用proc之前做的最后一件事是: INSERT INTO #temp_table (some fields...) SELECT some fields.. FROM inserted EXEC SOM

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

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

if @@rowcount=0
RETURN
该过程由触发器调用。触发器在调用proc之前做的最后一件事是:

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

EXEC SOMEPROC
发生的情况是,进程中的@rowcount始终为0,并且进程在执行任何操作之前结束。修复非常简单,因为我只需将@rowcount检查移到触发器中,并将其从进程中取出

但我很好奇为什么它一开始是这样写的。就像它曾经在某个时候起作用,现在不起作用了?我只是想检查一下,看看SQL2005和SQL2008之间的行为是否发生了一些变化,或者某些系统设置发生了变化。还是我的一位前任写了一段糟糕的代码,但从来都不起作用?

我不喜欢使用@ROWCOUNT来检查触发器的状态。过程中以及其间的太多其他语句可能会将其重置为0

例如:

SELECT TOP (10) name FROM sys.objects;
SET ANSI_NULLS ON;
SELECT @@ROWCOUNT;
----
0
相反,我会检查插入/删除的伪表。因此,对于插入或更新触发器:

IF EXISTS (SELECT 1 FROM inserted)
BEGIN
  ...
IF EXISTS (SELECT 1 FROM deleted)
BEGIN
  ...
对于删除触发器:

IF EXISTS (SELECT 1 FROM inserted)
BEGIN
  ...
IF EXISTS (SELECT 1 FROM deleted)
BEGIN
  ...

谢谢你的回答,但我并不是真的在寻找解决方案。我更感兴趣的是这是否有效。我同意这不是最好的解决方案,我会改变它。但是,我要问的是@rowcount的值是否应该从触发器持续到调用它的过程。否,@@rowcount的值在每次发出任何类型的语句时都会重置。例如,触发器中的EXEC调用会重置它。如果需要,可以更改该过程以接受计数作为可选参数,然后在填充ROWCOUNT的触发器中的语句之后立即设置一些set@localvariable=@@ROWCOUNT,然后你可以把这个值传递到过程中,不管同时发生了多少条语句。事实上,我想我只是根据Aaron在他的帖子中说的话来计算出来的。在@rowcount检查之前,proc正在set事务隔离级别read uncommitted上运行set nocount。当我翻转它们时,它起作用了。所以答案是肯定的;@rowcount的值在触发器和进程之间确实存在。然而,我同意Aaron的观点,这不是检查触发器是否起作用的好方法。