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
方案一:使用count(1) over()获取总记录数量
SELECT CSTNO, CSTABBR,COUNT(1) OVER () as TotalCount
FROM DBATABC
WHERE CSTABBR LIKE 'A%'
ORDER BY CSTNO
OFFSET ( @OffSetRowNo-1 ) * @FetchRowNo ROWS
FETCH NEXT @FetchRowNo ROWS ONLY
方式二:使用With AS
WITH Data_CTE
AS
(
SELECT [name], object_id
FROM sys.all_objects
--WHERE [name] LIKE 'fn_%'
),
Count_CTE
AS
(
SELECT COUNT(*) AS TotalRows FROM Data_CTE
)
SELECT *
FROM Data_CTE
CROSS JOIN Count_CTE
ORDER BY [name]
OFFSET (@PageNum - 1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;
参考地址:
https://stackoverflow.com/questions/18119463/better-way-for-getting-total-count-along-with-paging-in-sql-server-2012
SQL Server 2012以下版本:使用ROW_Number()
SELECT
*
FROM
(
SELECT
ROW_NUMBER() OVER(
ORDER
BY
Id
DESC
) rn,
COUNT
(1) OVER()
AS
TotalCount,
Id
FROM
dbo.T_User
)a
WHERE
a.rn
BETWEEN
1
AND
5