Разбиение на страницы – это важная задача для разработчиков при создании приложений. Оно позволяет пользователям просматривать данные порциями, а не загружать все данные сразу. SQL Server предлагает различные функции для разбиения на страницы, начиная с SQL Server 2000 и до последней версии, SQL Server 2012.
В этом блоге мы рассмотрим, как работает смещение строк и разбиение на страницы в разных версиях SQL Server. Вместо предоставления общего алгоритма, мы будем использовать базу данных AdventureWorks и предоставим скрипт, который вы можете запустить и экспериментировать с различными параметрами.
Нашей целью является получение строк с 51 по 60 из таблицы “SalesOrderDetails” в базе данных AdventureWorks. Для достижения этой цели вы можете установить базу данных AdventureWorks и запустить следующие запросы в зависимости от вашей версии SQL Server:
SQL Server 2012
USE AdventureWorks2012
DECLARE @RowsPerPage INT = 10
DECLARE @PageNumber INT = 6
SELECT SalesOrderDetailID, SalesOrderID, ProductID
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderDetailID
OFFSET (@PageNumber - 1) * @RowsPerPage ROWS
FETCH NEXT @RowsPerPage ROWS ONLY
SQL Server 2008 / R2 и SQL Server 2005
DECLARE @RowsPerPage INT = 10
DECLARE @PageNumber INT = 6
SELECT SalesOrderDetailID, SalesOrderID, ProductID
FROM (
SELECT SalesOrderDetailID, SalesOrderID, ProductID, ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS RowNum
FROM Sales.SalesOrderDetail
) AS SOD
WHERE SOD.RowNum BETWEEN ((@PageNumber - 1) * @RowsPerPage) + 1 AND @RowsPerPage * @PageNumber
SQL Server 2000
DECLARE @RowsPerPage INT = 10
DECLARE @PageNumber INT = 6
SELECT SalesOrderDetailID, SalesOrderID, ProductID
FROM (
SELECT TOP (@RowsPerPage) SalesOrderDetailID, SalesOrderID, ProductID
FROM (
SELECT TOP ((@PageNumber) * @RowsPerPage) SalesOrderDetailID, SalesOrderID, ProductID
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderDetailID
) AS SOD
ORDER BY SalesOrderDetailID DESC
) AS SOD2
ORDER BY SalesOrderDetailID ASC
Эти примеры демонстрируют различные подходы к разбиению на страницы в SQL Server. Хотя существуют более эффективные способы выполнения этой задачи, показанные выше техники являются эффективными и могут быть легко реализованы.
Если у вас есть какие-либо предложения или альтернативные методы для разбиения на страницы в SQL Server, пожалуйста, не стесняйтесь оставить комментарий.