Постраничный вывод(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

Комментарии

# re: Постраничный вывод(paging) в Microsoft SQL 2005

22.10.2007 12:34 | Splean

Отличная статья! Если б не она, парился бы через view...:)

Добавить комментарий






 
Copyright © Антон Ковалев