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

dth*_*her 83 sql t-sql sql-server oracle plsql

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

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

OMG*_*ies 79

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

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


Raj*_*ore 44

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

@@RowCount作品只有当你发出它随即.因此,如果要捕获错误,则必须在同一行上执行此操作.如果你把它拆开,你会错过你放在第二位的那个.

SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR
Run Code Online (Sandbox Code Playgroud)

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

SELECT @NumRowsChanged = @NumRowsChanged  + @@ROWCOUNT, @ErrorCode = @@ERROR
Run Code Online (Sandbox Code Playgroud)


Dud*_*lou 30

事实证明,这SET NOCOUNT ON是在存储过程脚本中设置的(默认情况下在SQL Server Management Studio上)并且SqlCommand.ExecuteNonQuery();始终返回-1.

我把它关掉了:SET NOCOUNT OFF无需使用@@ROWCOUNT.

更多详细信息,请参见:SqlCommand.ExecuteNonQuery()在执行Insert/Update/Delete时返回-1


Bob*_* Mc 8

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