【问题标题】:How can I get the number of records affected by a stored procedure?如何获取受存储过程影响的记录数?
【发布时间】:2010-11-15 03:22:14
【问题描述】:

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

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

【问题讨论】:

  • 设置不计数也是我的问题。要进行测试,请在 Management Studio 中执行您的存储过程并查看是否获得计数,如果有,请确保您有一个输出变量。

标签: sql sql-server oracle tsql plsql


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    @@RowCount 仅在您之后立即发出时才有效。因此,如果您要捕获错误,则必须在同一行进行。如果你把它分开,你将错过你放在第二位的任何一个。

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      更多细节在这里找到:SqlCommand.ExecuteNonQuery Method#Remarks

      当在连接上设置了 SET NOCOUNT ON 时(在执行命令之前或作为执行命令的一部分,或作为由执行命令启动的触发器的一部分),受单个语句影响的行将停止影响受影响的行数由该方法返回。
      如果未检测到有助于计数的语句,则返回值为 -1。如果发生回滚,返回值也是-1。

      【讨论】:

      • 这对我有用。我的存储过程只是一个简单的插入语句,它似乎正在工作。谢谢!
      • 谢谢!在参考方面做得很好。
      • blogs.msdn.com 链接已失效。
      • 感谢@Deantwo,我更新了它(来自 msdn 的更好)。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-09-22
          • 1970-01-01
          • 2014-07-02
          • 2011-05-01
          • 2015-12-15
          • 2019-05-15
          • 1970-01-01
          相关资源
          最近更新 更多