2009/05/08

SQL Server 2005 - Paging

Наиболее оптимальный вариант серверной разбивки на страницы:
;WITH SC AS
(
SELECT POST.[post_id],
ROW_NUMBER() OVER(ORDER BY POST.dt_last_post DESC) AS poz,
ROW_NUMBER() OVER(ORDER BY POST.dt_last_post ASC) AS poz_inv
FROM bb_post POST
)

SELECT CAST(poz + poz_inv - 1 as int) as rec_cnt,
POST.*
FROM SC
INNER JOIN bb_post POST WITH (NOLOCK) ON POST.post_id = SC.post_id
WHERE SC.poz > (@i_page-1) * @page_size AND SC.poz < (@i_page) * @page_size + 1
ORDER BY SC.poz ASC


Одновременно для записи выбираем ее порядковый номер в обоих направлениях сортировки. Сумма позиций записи -1 = и будет общее кол-во записей.

Комментариев нет: