CREATE PROCEDURE dbo.PageByPage
@PageNumber int = 1,
@PerPage int = 100
AS
BEGIN
SET NOCOUNT ON;
WITH the_keys AS
(
SELECT key_column
FROM dbo.table_name
ORDER BY key_column
OFFSET @PerPage * (@PageNumber - 1) ROWS
FETCH NEXT @PerPage ROWS ONLY
)
SELECT t.all_columns ...
FROM dbo.table_name AS t
INNER JOIN the_keys AS k
ON t.key_column = k.key_column
ORDER BY t.key_column;
END
GO
1条答案
按热度按时间643ylb081#
您的应用程序和用户不需要一百万行。你的程序为什么要把它们全部退回?您想使用pagination。
例如,在SQL Server中,可以使用
OFFSET
/FETCH
执行此操作:现在,您的应用程序跟踪您所在的页面,并在用户浏览页面时传递下一页或上一页。
CTE的原因是尽可能缩小初始搜索范围,因为您的实际查询可能更复杂(Aaron Bertrand谈到了这种方法here)。