【问题标题】:Display only 25 results but bring back the full count of results sql仅显示 25 个结果,但带回结果 sql 的完整计数
【发布时间】:2018-01-25 19:20:28
【问题描述】:

是否可以将存储过程的结果集限制为 25 个结果,但也可以返回结果总数(不限制)?此存储过程用于 Web 应用程序的搜索页面,因此我们对结果进行了分页(每页显示 25 个结果),但需要@@rowcount 来显示“您的结果返回___”结果。

我已经尝试了明显的方法,例如

SELECT COUNT(*) 
FROM [derived table containing the search query]

但由于数据结构、参与表中的行数,COUNT(*) 花费的时间比查询本身要长。

我提前为那里的格式坚持者道歉,对此还是很陌生!

【问题讨论】:

    标签: sql-server stored-procedures ssms resultset rowcount


    【解决方案1】:

    您可以尝试使用WITH common_table_expression

    WITH ResultSet AS
    (
        select CustomerID,CompanyName, ROW_NUMBER() over (Order by CompanyName asc) as RowNumber from Customers
    )
    select CustomerID,CompanyName,(Select Max(RowNumber) From ResultSet) AS TotalCount from ResultSet
    where RowNumber > 0 and RowNumber < 25
    

    在这种情况下,CompanyName 将是排序字段,您可以计算 max RowNumber 然后对其应用分页。

    另一种选择是

    declare @pageIndex int = 1
    declare @pageCount int = 25
    SELECT CustomerID, CompanyName,COUNT(*) OVER () as TotalCount
    FROM Customers
    ORDER BY CompanyName
    OFFSET ( @pageIndex-1 ) * @pageCount ROWS
    FETCH NEXT @pageCount ROWS ONLY
    

    Demo

    【讨论】:

    • 这正是我想要的,谢谢@Stormcloak!诚然有点尴尬;我没有意识到你可以做一个 COUNT(*) OVER(),我认为包括一个 COUNT 需要一个 GROUP BY 子句。再次感谢!
    【解决方案2】:

    如果您不是从派生表而是从原始表查询 Count,并且只获取应该比派生表更快的计数。然后,您可以将其存储在输出参数中。

    除此之外,我没有看到其他方法可以做到这一点。

    【讨论】:

    • 谢谢,@Dingo。不幸的是,SP 的编写方式非常困难。真的希望有一种方法可以使用 T-SQL 命令设置“执行后丢弃结果”选项,这样查询将如下所示:--T-SQL 更改为丢弃结果 SELECT * FROM (SELECT col1, col2 , FROM MyTable ) X ORDER BY X.col1 DESC SELECT @@ROWCOUNT AS TotalHi --undo T-SQL 更改以丢弃结果 SELECT * FROM ( SELECT col1, col2, FROM MyTable ) X ORDER BY X.col1 DESC OFFSET 0 ROWS FETCH仅接下来的 25 行
    【解决方案3】:

    为什么不这样做:

    declare @numrows int;
    SELECT @numrows = Count(*) FROM sys.databases;
    PRINT @numrows; -- or assign to output param
    

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 2012-04-30
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      相关资源
      最近更新 更多