SQL server - paginazione (parte1)

Alberto Miolo 6/2/2018 1

Tecniche di paginazione in SQL Server

A differenza di altri RDBMS, SQL Server non implementa fino alla versione 2012 istruzioni specifiche per la paginazione dei record.

In MySQL ad esempio è possibile scivere SELECT * FROM mia_tabella ORDER BY colonna1,colonna2 LIMIT 10,10; per ottenere come risultato i record (ordinati) dal decimo al ventesimo.

Per ottenere la stessa cosa in ORACLE (pl/SQL) è possibile utilizzare la sintassi: SELECT * FROM mia_tabella WHERE ROWNUM <= 20 and ROWNUM >10 ORDER BY colonna1,colonna2;

Non così in SQL Server. Fino alla versione 2012 era possibile ottenere i record dell'esempio sopra in questo modo:

SELECT * FROM (SELECT TOP 10 * FROM (SELECT TOP 20 FROM mia_tabella ORDER BY colonna1,colonna2) ORDER BY colonna1 DESC,colonna2 DESC) ORDER BY colonna1,colonna2;

oppure così:

;WITH Results_CTE AS
(
    SELECT
        Col1, Col2, ...,
        ROW_NUMBER() OVER (ORDER BY colonna1, colonna2, ...) AS RowNum
    FROM mia_tabella 
    WHERE <whatever>
)
SELECT *
FROM Results_CTE
WHERE RowNum > 10
AND RowNum <= 20;

A partire dalla versione 2012 è possibile scrivere così:

SELECT * FROM mia_tabella 
ORDER BY colonna1, colonna2
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;