23

我需要获取记录的总数以及分页。目前我在 SQL Server 2012 中按照下面列出的方式进行操作。这需要一个单独的查询来获取计数。SQL Server 2012 中是否有任何改进的方法?

ALTER PROCEDURE dbo.tpGetPageRecords
(
    @OffSetRowNo INT,     
    @FetchRowNo INT,
    @TotalCount INT OUT
) 
AS 

SELECT CSTNO, CSTABBR 
FROM DBATABC
WHERE CSTABBR LIKE 'A%'
ORDER BY CSTNO
OFFSET ( @OffSetRowNo-1 ) * @FetchRowNo ROWS
FETCH NEXT @FetchRowNo ROWS ONLY

SET @TotalCount = 
(SELECT COUNT(*)
FROM DBATABC
WHERE CSTABBR LIKE 'A%')


GO
4

1 回答 1

52

如果我们被允许更改合同,您可以:

SELECT CSTNO, CSTABBR,COUNT(*) OVER () as TotalCount
FROM DBATABC
WHERE CSTABBR LIKE 'A%'
ORDER BY CSTNO
OFFSET ( @OffSetRowNo-1 ) * @FetchRowNo ROWS
FETCH NEXT @FetchRowNo ROWS ONLY

现在,总数将作为结果集中的单独列提供。不幸的是,无法在同一语句中将此值分配给变量,因此我们不能再将其作为OUT参数提供。

这使用OVER子句(自 2005 年起可用)允许在整个(无限)结果集上计算聚合,而无需GROUPing。

于 2013-08-08T06:54:22.533 回答