如何获取受存储过程影响的记录数?
对于INSERT
,UPDATE
和DELETE
SQL语句直接针对数据库执行,大多数数据库提供程序返回受影响的行数。对于存储过程,受影响的记录数始终为-1
。如何获取受存储过程影响的记录数?
我们如何获取受存储过程影响的记录数?
注册为存储过程的输出参数,并设置基于@@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影响的记录数,而不是实际的语句!
原来这不是真的: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
这对我有用。我存储的proc只是一个简单的插入语句,而且它似乎在工作。谢谢! – 2013-07-14 11:25:57
没有设定计数是我的问题也是如此。为了测试,在管理工作室中执行你的存储过程,看看你是否有计数,如果你这样做,那么确保你有一个输出变量。 – user2624356 2013-12-10 15:04:30