【问题标题】:Possible to get resultset rowcount with query results?可以通过查询结果获取结果集行数吗?
【发布时间】:2009-10-28 18:18:49
【问题描述】:

目前我需要运行两个查询来获取结果集中的项目总数以及结果集中。是否有可能一次性获得结果集计数以及结果集到数据库。我正在尝试优化我的代码,因此我不必对数据库进行 2 次传递,因为这些单独的选择语句已经需要几分钟才能运行。我正在寻找 oracle sql 和 ms sql 的解决方案,因为我两者都使用。我还使用 Microsoft 的 Oracle 访问库来访问 Oracle 数据库,而不是 Oracle 访问库。

【问题讨论】:

    标签: c# sql oracle


    【解决方案1】:

    根据您的 Oracle 版本,您可以使用分析函数 count() 返回包含总行数的列。

    http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions032.htm#i82697

    select a.*,
           count(*) over() totalRows
      from table1 a;
    

    【讨论】:

    • 好建议。但是,您将如何使用 OracleDataReader 读出该列?使用方法 GetInt32 实际上会引发 InvalidCastException。
    • 它只是查询的附加列(类似于 count(*)),因此您可以像任何其他别名数字列一样输出它。
    • 其实我发现它在使用Convert.ToInt32(reader.GetDecimal(index))时有效
    【解决方案2】:

    OracleCommand 或 oracleDataReader 没有显示提取行的属性。取完所有行后,行数就知道了。

    但是如果您将所有数据提取到结果集中,则如上所述,您在resultset.Tables[0].Rows.Count 中拥有行数。这对数据库没有额外成本,因为 Count 是行集合的属性。索引号取决于结果集中的表格数量。

    【讨论】:

      【解决方案3】:

      好的,这可能就是您所追求的: @@ROWCOUNT

      它返回受用户上次数据库操作影响的行数。所以你不需要添加一列或做另一遍,只需做查询然后询问@@ROWCOUNT:

      将@@ROWCOUNT 选择为“Rows_Returned”

      编辑:

      这仅适用于 SQL 服务器。对于 Oracle,使用 SQL%Rowcount

      希望对你有帮助

      【讨论】:

      • 对 SQL Server 有效;该问题已标记为 Oracle。你会为 Oracle 使用 SQL%ROWCOUNT...
      • 其实OP是在追求SQL Server AND Oracle的解决方案,
      【解决方案4】:

      如果您正在迭代结果集,是否可以在每次迭代中增加一个计数器?

      一种策略可能是添加一列count(*) as RESULTSET_SIZE

      【讨论】:

      • 这也是我能想到的唯一解决方案,但我想知道是否有可以使用的方法或其他策略。如果没有更好的替代解决方案,我会将其标记为解决方案。
      猜你喜欢
      • 2018-07-29
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多