Разбиение результатов на страницы
Расширение предложения ORDER BY с названием OFFSET-FETCH позволяет вернуть только диапазон строк, выбранных в запросе. Оно добавляет возможность предоставить начальную точку (смещение) и значение, чтобы указать, сколько строк необходимо вернуть (значение выборки). Это расширение предоставляет удобный способ разбиения результатов на страницы.
Если необходимо вернуть строки постранично (используя любой номер страницы), следует учитывать, что каждый запрос с предложением OFFSET-FETCH выполняется независимо от любых других запросов. Состояние на стороне сервера не поддерживается, и вам нужно отслеживать свое положение через результирующий набор с помощью кода на стороне клиента.
Синтаксис OFFSET-FETCH
Синтаксис предложения OFFSET-FETCH, который формально является частью предложения ORDER BY, выглядит следующим образом:
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]
Использование OFFSET-FETCH
Чтобы использовать OFFSET-FETCH, необходимо указать начальное значение OFFSET, которое может быть равным нулю, и необязательное значение количества возвращаемых строк, как показано в следующем примере:
В этом примере будут возвращены первые 10 строк, а затем следующие 10 строк данных о продуктах на основе ListPrice:
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 0 ROWS --Skip zero rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
Чтобы получить следующую страницу данных о продукте, используйте предложение OFFSET, чтобы указать число пропускаемых строк:
SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC
OFFSET 10 ROWS --Skip 10 rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
В определении синтаксиса можно увидеть, что предложение OFFSET является обязательным, а предложение FETCH — нет. Если предложение FETCH опущено, будут возвращены все строки, следующие за предложением OFFSET. Кроме того, ключевые слова ROW и ROWS являются взаимозаменяемыми, также как и FIRST и NEXT, что обеспечивает более естественный синтаксис.
Чтобы гарантировать точность результатов, особенно при переходе между страницами данных, важно создать предложение ORDER BY, которое обеспечит уникальное упорядочение и предоставит детерминированный результат. Из-за особенностей в работе оптимизатора запросов SQL Server технически возможно отображать строку более чем на одной странице, если диапазон строк не является детерминированным.