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

时间:2009-07-29 16:06:52

标签: sql sql-server oracle tsql plsql

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

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

6 个答案:

答案 0 :(得分:78)

注册存储过程的out参数,如果使用SQL Server,则根据@@ROWCOUNT设置值。如果您使用的是Oracle,请使用SQL%ROWCOUNT

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

答案 1 :(得分:44)

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

@@RowCount仅在您之后立即发布时才有效。因此,如果要捕获错误,则必须在同一行上执行此操作。如果你把它拆开,你将会错过你放在第二位的那个。

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

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

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

答案 2 :(得分:29)

原来,我在存储过程脚本中设置了SET NOCOUNT ON(默认情况下在SQL Server Management Studio上),SqlCommand.ExecuteNonQuery();总是返回-1。

我只需将其设置为SET NOCOUNT OFF,而无需使用@@ROWCOUNT

更多详情请点击此处:SqlCommand.ExecuteNonQuery() returns -1 when doing Insert / Update / Delete

答案 3 :(得分:8)

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

答案 4 :(得分:4)

答案 5 :(得分:-1)

警告:如果要更改的表格附有触发器@@ROWCOUNT可能会返回虚假数据!

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