Published on

March 24, 2013

Понимание смещения строк и разбиение на страницы в SQL Server

Разбиение на страницы – это важная задача для разработчиков при создании приложений. Оно позволяет пользователям просматривать данные порциями, а не загружать все данные сразу. 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, пожалуйста, не стесняйтесь оставить комментарий.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.