我想问一下是否有一种方法可以使用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语句中的记录总数,以确定结果集页面的总数。
答案 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)
通过附在问题上的评论,很明显这个问题与分页有关。在这种情况下,有两种广泛的方法:
如果以千为单位测量总行数,则第一个选项可以正常工作。如果总数要高得多,最好的办法是运行两次查询。
这是典型的空间/处理权衡。
你的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