2012-05-08 81 views
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仍在原地。

回答

3

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

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

+0

所以无论ExecuteScalar()或方向=返回和读者它的价值,没有什么已经被ExecuteNonQuery()返回,right – abatishchev

+0

@abatishchev没有*返回* ExecuteNonQuery - 然而,任何out/ref/return -value参数将在原地更新,因此在调用之后,您可以从该参数获得'.Value' –

1

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

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

[新增] SET NOCOUNT是一个斜命令。关闭时,将为每个查询运行返回信息(选择,更新,插入,删除);当打开时,它不是。 (因此,将它设置在你做的地方不起作用。)问题是,这个信息不是返回值,参数值或数据集,而是其他的东西(它是一个数字?一个字符串?米不确定)。从我听过的所有内容开始看起来很痛苦,这就是为什么我总是用SET NOCOUNT on开始我的存储过程。

在这两种情况下,我都没有看到@count被定义或赋值的位置。

+0

我已更新了如何填充@count – abatishchev

+0

返回x是否影响由ExecuteNonQuery返回的值( )'? – abatishchev

+0

我对ado.net的回答不够熟悉。我会和@Marc Gravell的建议(+1)一起使用带有“ReturnValue”的参数。而且我正在更新提到SET NOCOUNT的答案。 –