.net 重写内部使用游标的存储过程返回的受影响的行数

.net 重写内部使用游标的存储过程返回的受影响的行数,.net,ado.net,sql-server-2012,rowcount,nocount,.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

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

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
但是ExecuteOnQuery仍然返回-1

我可以使用select@count和ExecuteScalar,但我想知道为什么我的代码不起作用


似乎NOCOUNT OFF并没有重置服务器行为,NOCOUNT ON仍然存在。

首先,不要弄乱SET ROWCOUNT-如果使用不当,这会造成非常危险的后果


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

首先,不要弄乱设置行数-如果使用不当,这会造成非常危险的后果

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

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

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

[新增]SET NOCOUNT是一个倾斜命令。禁用时,将返回每次查询运行的信息选择、更新、插入、删除;如果启用,则不是。因此,把它放在你做的地方是没有效果的。问题是,这个信息不是返回值、参数值或数据集,而是其他东西,它是一个数字吗?一根绳子?我不确定。从我所听到的一切来看,处理它是一件痛苦的事情,这就是为什么我总是在启动存储过程时启用SETNOCOUNT

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

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

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

[新增]SET NOCOUNT是一个倾斜命令。禁用时,将返回每次查询运行的信息选择、更新、插入、删除;如果启用,则不是。因此,把它放在你做的地方是没有效果的。问题是,这个信息不是返回值、参数值或数据集,而是其他东西,它是一个数字吗?一根绳子?我不确定。从我所听到的一切来看,处理它是一件痛苦的事情,这就是为什么我总是在启动存储过程时启用SETNOCOUNT


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

返回x会影响ExecuteOnQuery返回的值吗?我对ado.net不太熟悉,无法回答这个问题。我同意@Marc Gravell的建议,使用带有ReturnValue的参数。我正在更新我的答案,以提及SET NOCOUNT。返回x会影响ExecuteOnQuery返回的值吗?我对ado.net不够熟悉,无法回答这个问题。我同意@Marc Gravell的建议,使用带有ReturnValue的参数。我正在更新我的答案,以提及SET NOCOUNT。所以要么是ExecuteScalar,要么是Direction=Return和reader它的值,而不是ExecuteNonQuery返回的值,right@abatishchevExecuteOnQuery不返回任何内容-但是,任何out/ref/return值参数都将就地更新,因此,在调用之后,您可以从该参数获取.Value。因此,ExecuteScalar或Direction=Return和reader是它的值,而不是ExecuteNonQuery返回的值,right@abatishchevExecuteOnQuery不返回任何内容-但是,任何out/ref/return值参数都将就地更新,因此,在调用之后,您可以从该参数获取.Value