覆盖由使用游标内部的存储过程返回的受影响的行数

时间:2012-05-08 17:27:57

标签: .net ado.net sql-server-2012 rowcount nocount

我将存储过程简化为以下代码:

SET NOCOUNT ON

DECLARE @count INT
DECLARE @temp TABLE
INSERT INTO @temp
SELECT @count = count(*) FROM @temp

DECLARE [cursor] FOR SELECT id FROM @temp
OPEN [cursor] FETCH NEXT FROM [cursor] INTO @id WHILE @@fetch_status = 0
BEGIN
    exec anoterStoredProc @id
FETCH NEXT FROM [cursor] INTO @id
END
CLOSE [cursor]
DEALLOCATE [cursor]

SET NOCOUNT OFF

RETURN @count

ExecuteNonQuery()仍然返回-1!

我可以使用select @countExecuteScalar(),但想了解我的代码无效的原因。

似乎NOCOUNT OFF未重置服务器行为,NOCOUNT ON仍在原位。

2 个答案:

答案 0 :(得分:3)

首先,不要乱用SET ROWCOUNT - 这会造成非常危险的事情(如果使用不当)。

返回值实际上是通过添加一个带有ReturnValue“direction”的参数来处理的。或者,选择值,然后使用ExecuteScalar。

答案 1 :(得分:1)

SET ROWCOUNT xx用于限制所有后续查询返回的行数。它不会用于返回标量值。

RETURN xx用于将整数值返回给调用该过程的进程。通常,这用于表示成功(零)或失败(不是零,可能是错误号)。对于特定值,您可能会发现输出参数更方便。

[已添加] SET NOCOUNT是一个倾斜命令。禁用时,每次查询运行都会返回信息(选择,更新,插入,删除);什么时候开启,不是。 (因此,在你所做的地方设置它将没有任何效果。)问题是,这个信息不是返回值,参数值或数据集,而是另一个其他东西(它是一个数字?一个字符串?我'我不确定)。从我听过的所有内容来看,这都是一种痛苦,这就是为什么我总是用SET NOCOUNT on开始我的存储过程。

在这两种情况下,我都没有看到@count的定义或分配值。