Wyniki strony
Rozszerzenie klauzuli ORDER BY o nazwie OFFSET-FETCH umożliwia zwrócenie tylko zakresu wierszy wybranych przez zapytanie. Dodaje możliwość podawania punktu początkowego (przesunięcia) i wartości w celu określenia liczby wierszy, które mają być zwracane (wartość pobierania). To rozszerzenie zapewnia wygodną technikę stronicowania wyników.
Jeśli chcesz zwrócić wiersze "page" naraz (przy użyciu dowolnej liczby wybranej dla strony), należy wziąć pod uwagę, że każde zapytanie z klauzulą OFFSET-FETCH jest uruchamiane niezależnie od innych zapytań. Nie ma obsługiwanego stanu po stronie serwera i należy śledzić pozycję za pośrednictwem zestawu wyników za pośrednictwem kodu po stronie klienta.
Składnia OFFSET-FETCH
Składnia klauzuli OFFSET-FETCH, która jest technicznie częścią klauzuli ORDER BY, jest następująca:
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]
Korzystanie z funkcji OFFSET-FETCH
Aby użyć funkcji OFFSET-FETCH, należy podać początkową wartość PRZESUNIĘCIA, która może być równa zero, oraz opcjonalną liczbę wierszy do zwrócenia, jak w poniższym przykładzie:
Ten przykład zwróci pierwsze 10 wierszy, a następnie zwróci następne 10 wierszy danych produktu na podstawie wartości 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
Aby pobrać następną stronę danych produktu, użyj klauzuli OFFSET, aby określić liczbę wierszy do pominięcia:
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
W definicji składni można zobaczyć, że klauzula OFFSET jest wymagana, ale klauzula FETCH nie jest. Jeśli klauzula FETCH zostanie pominięta, zostaną zwrócone wszystkie wiersze następujące po funkcji OFFSET. Przekonasz się również, że słowa kluczowe WIERSZe i WIERSZe są wymienne, podobnie jak FIRST i NEXT, co umożliwia bardziej naturalną składnię.
Aby zapewnić dokładność wyników, szczególnie podczas przechodzenia ze strony do strony danych, ważne jest utworzenie klauzuli ORDER BY, która zapewni unikatowe kolejność i daje wynik deterministyczny. Ze względu na sposób działania optymalizatora zapytań programu SQL Server technicznie można wyświetlić wiersz na więcej niż jednej stronie, chyba że zakres wierszy jest deterministyczny.