Resultados da página

Concluído

Uma extensão para a cláusula ORDER BY chamada OFFSET-FETCH permite que você retorne apenas um intervalo das linhas selecionadas pela consulta. Ela inclui 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). Essa extensão fornece uma técnica conveniente para paginar pelos resultados.

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

Sintaxe do 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 o OFFSET-FETCH, você fornecerá um valor OFFSET inicial, que pode ser zero, e um número opcional de linhas a serem retornadas, como no exemplo a seguir:

Este exemplo retornará as primeiras 10 linhas e, depois, retornará as próximas 10 linhas de dados de produto com base em 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 de produto, use a cláusula OFFSET para especificar o número de linhas a ignorar:

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 verá 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 enquanto você passa pelas páginas de dados, é importante construir uma cláusula ORDER BY, que fornecerá uma 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.