如何获得受存储过程影响的记录数?


86

对于INSERTUPDATEDELETE直接对数据库执行SQL语句,大多数数据库提供商返回受影响的行数。对于存储过程,受影响的记录数始终为-1

如何获得受存储过程影响的记录数?


1
设置无计数也是我的问题。要进行测试,请在Management Studio中执行您的存储过程,并查看是否得到计数(如果有),然后确保您具有输出变量。
user2624356

Answers:


80

为存储过程注册一个out参数,并根据@@ROWCOUNT是否使用SQL Server来设置值。使用SQL%ROWCOUNT,如果你使用的是Oracle。

请注意,如果有多个INSERT/UPDATE/DELETE,则需要一个变量来存储@@ROWCOUNT每个操作的结果。


46

@@RowCount 将为您提供受SQL语句影响的记录数。

@@RowCount仅当您之后立即发布时,该作品才有效。因此,如果要捕获错误,则必须在同一行上执行。如果将其拆分,您将错过第二名。

SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR

如果有多个语句,则必须捕获每个语句受影响的行数并将其累加起来。

SELECT @NumRowsChanged = @NumRowsChanged  + @@ROWCOUNT, @ErrorCode = @@ERROR

33

对我来说,它SET NOCOUNT ON是在存储过程脚本中设置的(默认在SQL Server Management Studio中),并且SqlCommand.ExecuteNonQuery();始终返回-1。

我只是将其关闭:SET NOCOUNT OFF无需使用@@ROWCOUNT

在此处找到更多详细信息:SqlCommand.ExecuteNonQuery()在执行插入/更新/删除时返回-1


这对我有用。我存储的proc只是一个简单的insert语句,它似乎正在工作。谢谢!
哈维·达维

谢谢!做好参考。
Leo Gurdian

8

对于Microsoft SQL Server,您可以返回@@ROWCOUNT变量以返回受存储过程中最后一条语句影响的行数。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.