【发布时间】:2011-01-19 11:25:30
【问题描述】:
我想用这种方法实现表分页:
SET @PageNum = 2;
SET @PageSize = 10;
WITH OrdersRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
,*
FROM dbo.Orders
)
SELECT *
FROM OrdersRN
WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1
AND @PageNum * @PageSize
ORDER BY OrderDate ,OrderID;
有什么我应该注意的吗? 表有数百万条记录。
谢谢。
编辑:
在使用建议的MAXROWS 方法一段时间后(效果非常快),我不得不切换回ROW_NUMBER 方法,因为它具有更大的灵活性。到目前为止,我对它的速度也很满意(我正在使用 View 拥有超过 100 万条记录和 10 列)。要使用任何类型的查询,我使用以下修改:
PROCEDURE [dbo].[PageSelect]
(
@Sql nvarchar(512),
@OrderBy nvarchar(128) = 'Id',
@PageNum int = 1,
@PageSize int = 0
)
AS
BEGIN
SET NOCOUNT ON
Declare @tsql as nvarchar(1024)
Declare @i int, @j int
if (@PageSize <= 0) OR (@PageSize > 10000)
SET @PageSize = 10000 -- never return more then 10K records
SET @i = (@PageNum - 1) * @PageSize + 1
SET @j = @PageNum * @PageSize
SET @tsql =
'WITH MyTableOrViewRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS RowNum
,*
FROM MyTableOrView
WHERE ' + @Sql + '
)
SELECT *
FROM MyTableOrViewRN
WHERE RowNum BETWEEN ' + CAST(@i as varchar) + ' AND ' + cast(@j as varchar)
exec(@tsql)
END
如果您使用此过程,请确保您阻止了 sql 注入。
【问题讨论】:
-
Pony,我对这个答案不太满意,主要是因为它甚至没有提到 Row_Number() ..... 问题又是:我正在使用 Row_Number()。你能告诉我它与其他方法相比的性能(所以,不要给我提供其他方法)
-
顺便说一句,Pony 我觉得这样的言论非常粗鲁。我确信我知道我的问题的好答案是什么,我不需要你告诉我。典型的amdin BS。
标签: sql-server paging