我将存储过程简化为以下代码:
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 @count
和ExecuteScalar()
,但想了解我的代码无效的原因。
似乎NOCOUNT OFF
未重置服务器行为,NOCOUNT ON
仍在原位。
答案 0 :(得分:3)
首先,不要乱用SET ROWCOUNT - 这会造成非常危险的事情(如果使用不当)。
返回值实际上是通过添加一个带有ReturnValue“direction”的参数来处理的。或者,选择值,然后使用ExecuteScalar。
答案 1 :(得分:1)
SET ROWCOUNT xx
用于限制所有后续查询返回的行数。它不会用于返回标量值。
RETURN xx
用于将整数值返回给调用该过程的进程。通常,这用于表示成功(零)或失败(不是零,可能是错误号)。对于特定值,您可能会发现输出参数更方便。
[已添加] SET NOCOUNT
是一个倾斜命令。禁用时,每次查询运行都会返回信息(选择,更新,插入,删除);什么时候开启,不是。 (因此,在你所做的地方设置它将没有任何效果。)问题是,这个信息不是返回值,参数值或数据集,而是另一个其他东西(它是一个数字?一个字符串?我'我不确定)。从我听过的所有内容来看,这都是一种痛苦,这就是为什么我总是用SET NOCOUNT on
开始我的存储过程。
在这两种情况下,我都没有看到@count的定义或分配值。