Постраничный вывод(paging) в Microsoft SQL 2005
Постраничная выборка всегда была головной болью при работе c MS SQL. Есть очень много способов, одни лучше, другие хуже. Последний применяемый мною способ я подсмотрел при генерации LINQ. Но сейчас о paging в SQL 2005. Наконец то, там появился пейджинг стандартными методами! Делается очень просто:
select * from mytable
Where ID between 20 and 30
Но такой способ не всегда подходит, часто приходится работать с большими объемами данных или выполнять сложные запросы с выборками из множества таблиц.
Применив ROW_NUMBER() OVER можно заметно ускорить выборку данных.
With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as RowNumber
FROM Customers )
select *
from Cust
Where RowNumber Between 20 and 30
И если до конца развить идею, вот хранимая процедура входящими параметрами которой задается номер страницы и её размер.
CREATE PROC GetCustomersByPage
@PageSize int, @PageNumber int
AS
Declare @RowStart int
Declare @RowEnd int
if @PageNumber > 0
Begin
SET @PageNumber = @PageNumber -1
SET @RowStart = @PageSize * @PageNumber + 1;
SET @RowEnd = @RowStart + @PageSize - 1 ;
With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as RowNumber
FROM Customers )
select *
from Cust
Where RowNumber >= @RowStart and RowNumber <= @RowEnd end
END
30 июня 2007 г. 2:19