如何在SELECT T-SQL命令中包含结果集中返回的行总数?

时间:2010-05-12 17:47:56

标签: sql sql-server tsql

我想问一下是否有一种方法可以使用Row_Number(SQL 2005)命令在TSQL查询的返回结果集中包含总行数(作为附加列)。 例如,以类似于以下的形式从Book表中获取查询结果集:

RowNum   BookId     BookTitle    TotalRows
--------------------------------------------
1        1056       Title1       5    
2        1467       Title2       5    
3        121        Title3       5    
4        1789       Title4       5    
5        789        Title5       5

该查询是存储过程中实现的自定义分页功能的一部分。目标是仅返回当前页面索引的记录并限制为页面大小,还要返回select语句中的记录总数,以确定结果集页面的总数。

7 个答案:

答案 0 :(得分:18)

在SQL Server 2008及更高版本中,添加COUNT(*)OVER()作为查询中的列名称之一,并将使用返回的总行填充。它在每一行中重复,但至少可以获得该值。许多其他解决方案不起作用的原因在于,对于非常大的结果集,在迭代所有行之后,您将不知道总数,这在许多情况下是不实际的(尤其是顺序处理解决方案)。例如,在调用第一个IDataReader.Read()之后,此技术为您提供总计数。

select COUNT(*) OVER () as Total_Rows, ... from ...

答案 1 :(得分:13)

在SQL Server 2005及更高版本中,您可以使用CTE执行此操作:

WITH result AS (SELECT ... your query here ...)
SELECT
    *,
    (SELECT COUNT(*) FROM result) AS TotalRows
FROM result

总的来说,我建议不要这样做,但如果你真的需要那么这就是怎么做的。

答案 2 :(得分:3)

通过附在问题上的评论,很明显这个问题与分页有关。在这种情况下,有两种广泛的方法:

  1. 查询符合搜索条件的所有行(不只是一页值)并存储到表值变量(以及ROW_NUMBER)中。然后针对该表值变量运行两个查询:一个用于提取所需的数据页面,另一个用于获取总计数。
  2. 不要使用表值变量,只运行完整查询两次,一次获取数据页面,一次查看总计数。
  3. 如果以千为单位测量总行数,则第一个选项可以正常工作。如果总数要高得多,最好的办法是运行两次查询。

    这是典型的空间/处理权衡。

    你的milage可能会有所不同 - 对于一种情况有效的方法在另一种情况下可能会很糟糕!

答案 3 :(得分:2)

使用AdventureWorks数据库的示例

select 
    *, 
    TotalVolume = (select COUNT(*) from HumanResources.Department) 
from  HumanResources.Department

答案 4 :(得分:1)

也许您正在寻找的是@@ROWCOUNT

答案 5 :(得分:0)

SELECT  n ,
        COUNT(*) OVER ( PARTITION BY 1 )
FROM    ( SELECT    1 AS n
          UNION ALL
          SELECT    2 AS n
        ) AS t

请注意,@@ ROWCOUNT为您提供上一个命令的行数。运行这个:

SELECT    1 AS n;

SELECT  n ,
        @@ROWCOUNT
FROM    ( SELECT    1 AS n
          UNION ALL
          SELECT    2 AS n
        ) AS t

答案 6 :(得分:-3)

select *, @@rowcount from MyTable