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

问题描述:

对于INSERT,UPDATEDELETE SQL语句直接针对数据库执行,大多数数据库提供程序返回受影响的行数。对于存储过程,受影响的记录数始终为-1如何获取受存储过程影响的记录数?

我们如何获取受存储过程影响的记录数?

+1

没有设定计数是我的问题也是如此。为了测试,在管理工作室中执行你的存储过程,看看你是否有计数,如果你这样做,那么确保你有一个输出变量。 – user2624356 2013-12-10 15:04:30

注册为存储过程的输出参数,并设置基于@@ROWCOUNT如果使用SQL Server的价值。如果您使用的是Oracle,请使用SQL%ROWCOUNT

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

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

@@RowCount会给你受SQL语句影响的记录数。

@@RowCount只适用于以后立即发布。所以如果你陷入错误,你必须在同一条线上完成。如果你把它分开,你会错过任何你放在第二位的。

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

如果您有多个语句,你必须抓住影响到了每个人的行数,并把它们加起来。

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

警告:@@ROWCOUNT可能返回虚假数据是否被修改的表已经触发连接到它

@@ROWCOUNT将返回受TRIGGER影响的记录数,而不是实际的语句!

+8

原来这不是真的:http://*.com/questions/7005225/sql-server-does-trigger-affects-rowcount – Tao 2013-03-15 20:07:44

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

我只是把它关掉:SET NOCOUNT OFF而不需要使用@@ROWCOUNT。这里找到

更多细节:SqlCommand.ExecuteNonQuery() returns -1 when doing Insert/Update/Delete

+0

这对我有用。我存储的proc只是一个简单的插入语句,而且它似乎在工作。谢谢! – 2013-07-14 11:25:57