Restituire i risultati in più pagine

Completato

Un'estensione della clausola ORDER BY denominata OFFSET-FETCH consente di restituire solo un intervallo delle righe selezionate dalla query in uso. Aggiunge la possibilità di fornire un punto iniziale (un offset) e un valore per specificare il numero di righe da restituire (un valore di recupero). Questa estensione offre una tecnica pratica per il paging dei risultati.

Se si vogliono restituire righe una "pagina" alla volta (usando qualsiasi numero scelto per una pagina), è necessario considerare che ogni query con clausola OFFSET-FETCH viene eseguita indipendentemente da ogni altra query. Non viene mantenuto alcuno stato sul lato server ed è necessario tenere traccia della posizione tramite un set di risultati per mezzo del codice sul lato client.

Sintassi OFFSET-FETCH

La sintassi della clausola OFFSET-FETCH, che fa tecnicamente parte della clausola ORDER BY, è la seguente:

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

Utilizzo di OFFSET-FETCH

Per usare OFFSET-FETCH, specificare un valore di OFFSET iniziale, che può essere zero, e un numero facoltativo di righe da restituire, come nell'esempio seguente:

Questo esempio restituirà le prime 10 righe e successivamente le 10 righe successive di dati sui prodotti in base alla proprietà 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

Per recuperare la pagina successiva dei dati sui prodotti, usare la clausola OFFSET per specificare il numero di righe da ignorare:

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

Nella definizione della sintassi è possibile vedere che la clausola OFFSET è obbligatoria, mentre non lo è la clausola FETCH. Se la clausola FETCH viene omessa, verranno restituite tutte le righe successive a OFFSET. Inoltre, sarà evidente che le parole chiave ROW e ROWS sono intercambiabili, così come FIRST e NEXT, consentendo una sintassi più naturale.

Per garantire l'accuratezza dei risultati, soprattutto quando si passa da una pagina all'altra dei dati, è importante creare una clausola ORDER BY che fornirà un ordinamento univoco e genererà un risultato deterministico. A causa della modalità di funzionamento di Query Optimizer di SQL Server, è tecnicamente possibile che una riga venga visualizzata in più di una pagina, a meno che l'intervallo di righe non sia deterministico.