Un database può avere centinaia di migliaia di record. È facile inserire e selezionare questi record tramite sistemi di gestione di database come SQL Server o MySQL ecc. Tuttavia, non è facile visualizzare migliaia di record su una singola pagina Web o in un'applicazione desktop. I limiti di spazio e memoria rendono difficile visualizzare un numero enorme di record contemporaneamente.
Una soluzione comune a un problema del genere consiste nell'implementare il paging. (Nota, questo non è il paging della memoria implementato dai sistemi operativi) Il paging nella programmazione si riferisce alla visualizzazione dei dati tramite una serie di pagine. Una ricerca casuale su Google può produrre migliaia di risultati. Google utilizza il paging per visualizzare questi risultati. Se scorri verso il basso la pagina di Google con i risultati di ricerca vedrai quanto segue:
Qui puoi vedere il numero di pagine in cui è suddiviso il risultato della ricerca. Puoi fare clic sul collegamento Avanti per visualizzare più pagine.
In questo articolo vedremo come utilizzare gli operatori OFFSET FETCH NEXT per implementare il paging su applicazioni front-end. Inizieremo con un semplice esempio utilizzando l'operatore OFFSET FETCH NEXT e vedremo poi come può essere utilizzato in pratica con l'aiuto di una stored procedure.
Utilizzo di OFFSET FETCH NEXT per il paging in SQL Server
SQL Server contiene gli operatori OFFSET e NEXT per implementare il paging. L'operatore OFFSET sposta il successivo K numero di risultati della ricerca dall'inizio, mentre l'operatore FETCH NEXT recupera i NEXT N risultati dove K e N sono numeri interi.
Preparazione di dati fittizi
Prima di poter vedere OFFSET FETCH NEXT in azione, creiamo un database fittizio con 200 record. È possibile utilizzare un database funzionante se si è sicuri al 100% che il backup sia stato eseguito correttamente. Esegui il seguente script per farlo:
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars ( id INT PRIMARY KEY IDENTITY, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL )
Nello script sopra creiamo un database fittizio ShowRoom con una tabella chiamata Cars. Aggiungiamo alcuni record fittizi in questo database. Esegui il seguente script:
USE ShowRoom DECLARE @count INT SET @count = 1 DECLARE @carname VARCHAR (50) DECLARE @company_name VARCHAR (50) WHILE (@count <= 200) BEGIN SET @carname = 'Car - ' + LTRIM(@count) SET @company_name = 'Company - '+ LTRIM(@count) INSERT INTO Cars VALUES (@carname, @company_name, @count * 5) SET @count = @count + 1 END
Dai un'occhiata attenta allo script sopra. Lo script precedente inserisce 200 record fittizi nella tabella Cars. Lo script utilizza un ciclo while per 200 iterazioni. Ogni iterazione aggiunge la parola "Car -" al numero di iterazione e il risultato viene inserito nella colonna del nome della tabella Cars. Allo stesso modo, la parola "Società -" viene aggiunta al numero di iterazione e viene inserita nella colonna società in ogni iterazione. Infine, ad ogni iterazione, il numero di iterazione viene moltiplicato per 5 e il risultato viene inserito nella colonna di alimentazione. Ora, se selezioni tutti i record dalla tabella Cars, vedrai 200 record nel set di risultati. Esegui la seguente query per farlo:
SELECT * FROM Cars
Lo screenshot del risultato parziale della query di cui sopra è il seguente. Puoi vedere 200 righe nel risultato.
Esempio OFFSET FETCH NEXT
Ora diamo un'occhiata a OFFSET NEXT in azione. La sintassi di OFFSET NEXT è la seguente:
SELECT * FROM Table_Name ORDER BY COLUMN_NAME/S OFFSET Number_of_rows_to_Skip ROWS FETCH NEXT Number_of_rows_to_Fetch ROWS ONLY
È importante ricordare qui che è necessario utilizzare la clausola ORDER BY con le clausole OFFSET FETCH NEXT.
Vediamo un semplice esempio di OFFSET FETCH NEXT in cui ordineremo i dati in base alla colonna id della tabella Cars, salteremo le prime 20 righe e recupereremo le 10 righe successive. Esegui il seguente script:
USE ShowRoom SELECT * FROM Cars ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
Nell'output dello script sopra, vedrai i record con un valore id compreso tra 21 e 30 poiché abbiamo saltato i primi 20 record e abbiamo recuperato i 10 successivi.
Utilizzo di OFFSET FETCH NEXT con stored procedure
Se stai implementando il paging in un'applicazione front-end come un sito Web o un'applicazione desktop, in genere invierai i valori del numero di pagina e delle dimensioni della pagina al server tramite una procedura memorizzata. A seconda del valore del numero di pagina e della dimensione della pagina, la procedura memorizzata restituirà il set di righe corretto. Scriviamo una tale procedura memorizzata che prende il numero di pagina e la dimensione della pagina come parametri e restituisce i record corrispondenti.
Dai un'occhiata al seguente script:
USE ShowRoom GO CREATE PROC spGetRecordsByPageAndSize @Page INT, @Size INT AS BEGIN SELECT * FROM Cars ORDER BY id OFFSET (@Page -1) * @Size ROWS FETCH NEXT @Size ROWS ONLY END
Nello script sopra creiamo una stored procedure spGetRecordsByPageAndSize che accetta 2 parametri @Page e @Size. La procedura memorizzata utilizza OFFSET FETCH NEXT per filtrare i record in base al numero di pagine e alle dimensioni della pagina. Ad esempio, se il numero di pagina è 2 e la dimensione è 20, l'OFFSET sarà:
(2 – 1) * 20 =20
E il valore per FETCH successivo sarà uguale a @Size, ovvero 20. Pertanto verranno restituiti i record con ID da 21 a 40. Eseguire lo script precedente per creare una stored procedure.
Una volta creata la stored procedure, eseguire lo script seguente per vedere cosa viene restituito quando il numero di pagina è 2 e la dimensione della pagina è 20.
EXECUTE spGetRecordsByPageAndSize 2, 20
L'output dello script precedente è simile al seguente:
Allo stesso modo, se desideri recuperare i record per la quarta pagina con 15 record per pagina, la query seguente recupera i record da id 46 a id 60.
EXECUTE spGetRecordsByPageAndSize 4, 15
L'output di è simile al seguente:
Conclusione
OFFSET FETCH NEXT è uno strumento estremamente utile, in particolare se si desidera visualizzare un gran numero di record raggruppati in pagine. In questo articolo abbiamo visto come viene utilizzato insieme a una stored procedure per implementare il paging su applicazioni front-end.