Лучший способ получить общий счет вместе с пейджингом в SQL Server 2012

У меня есть требование получить общее количество записей вместе с пейджингом. В настоящее время я делаю это, как указано ниже, в 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

Ответ 1

Если нам разрешено изменять контракт, вы можете:

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 года), чтобы можно было вычислить агрегат по всему (неограниченному) набору результатов и не требуя GROUP ING.