1

我有一个简化为以下代码的存储过程:

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仍然在原地。

4

2 回答 2

3

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

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

于 2012-05-08T17:35:19.197 回答
1

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

RETURN xx用于向调用过程的进程返回一个整数值。一般这是用来表示成功(零)或失败(不是零,大概是错误号)。对于特定值,您可能会发现输出参数更方便。

[添加]SET NOCOUNT是一个斜命令。关闭时,为每个查询运行(选择、更新、插入、删除)返回信息;打开时,它不是。(因此,将其设置在您所做的地方不会有任何效果。)问题是,此信息不是返回值、参数值或数据集,而是其他东西(它是一个数字吗?一个字符串?我我不确定)。从我听说过的所有事情来看,使用它很痛苦,这就是为什么我总是用SET NOCOUNT on.

在这两种情况下,我都没有看到 @count 是在哪里定义或赋值的。

于 2012-05-08T17:35:59.473 回答