Resultados da página

Concluído

Uma extensão da cláusula ORDER BY chamada OFFSET-FETCH permite que você retorne apenas um intervalo das linhas selecionadas pela consulta. Ele adiciona a capacidade de fornecer um ponto de partida (um deslocamento) e um valor para especificar quantas linhas você gostaria de retornar (um valor de busca). Esta extensão fornece uma técnica conveniente para paginação através de resultados.

Se você quiser retornar linhas uma "página" de cada vez (usando qualquer número que você escolher para uma página), você precisará considerar que cada consulta com uma cláusula OFFSET-FETCH é executada independentemente de quaisquer outras consultas. Não há nenhum estado do lado do servidor mantido, e você precisará acompanhar sua posição por meio de um conjunto de resultados por meio do código do lado do cliente.

Sintaxe OFFSET-FETCH

A sintaxe da cláusula OFFSET-FETCH, que é tecnicamente parte da cláusula ORDER BY, é a seguinte:

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]

Usando OFFSET-FETCH

Para usar OFFSET-FETCH, você fornecerá um valor OFFSET inicial, que pode ser zero, e um número opcional de linhas para retornar, como no exemplo a seguir:

Este exemplo retornará as primeiras 10 linhas e, em seguida, retornará as próximas 10 linhas de dados do produto com base no 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

Para recuperar a próxima página de dados do produto, use a cláusula OFFSET para especificar o número de linhas a serem ignoradas:

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

Na definição de sintaxe, você pode ver que a cláusula OFFSET é necessária, mas a cláusula FETCH não. Se a cláusula FETCH for omitida, todas as linhas após OFFSET serão retornadas. Você também descobrirá que as palavras-chave ROW e ROWS são intercambiáveis, assim como FIRST e NEXT, o que permite uma sintaxe mais natural.

Para garantir a precisão dos resultados, especialmente quando você se move de página em página de dados, é importante construir uma cláusula ORDER BY que fornecerá ordenação exclusiva e produzirá um resultado determinístico. Devido à maneira como o otimizador de consulta do SQL Server funciona, é tecnicamente possível que uma linha apareça em mais de uma página, a menos que o intervalo de linhas seja determinístico.