Una nuova feature di SqlServer 2005 consente di paginare agevolmente i record di una query. Si tratta della nuova clausola TOP, che si presenta come una funzione che accetta anche dei parametri dinamici. Chi ha provato in Sql Server 2000 a paginare i record di una tabella si sarà scontrato con delle difficoltà talvolta davvero eccessive. Paginare significava creare sempre delle query dinamiche, facendo uso di TOP, SET ROWCOUNT, con tutti i rischi si sql injection che questo comporta.

Ecco, nel box come con Sql Server 2005 si potrà paginare una tabella. Il criterio è quello di estrarre i primi n record (righe x pagina) dopo aver escluso le prime m pagine, dove m parte da 0 che ha il significato di pagina 1.

declare @pagesize int;
declare @pageindex int;

-- dimensione di una pagina
set @pagesize 10;
-- indice della pagina richiesta dove 0==prima pagina
set @pageindex 0;

select top(@pagesize) * 
    
from sysobjects 
    
where id not in 
    ( 
        
select top(@pagesize @pageindexid 
            from 
sysobjects 
            
order by name asc
    
)
    
order by name asc;

Con l'uso di TOP(n) la questione si semplifica notevolmente, ma tuttavia ancora non siamo in presenza di una soluzione ottimale come quella che ad esempio è presente in MySql (clausola LIMIT). Infatti dovremo comunque replicare l'istruzione per ogni tipo colonna di ordinamento, e in caso di uso di una WHERE ricadremo ancora una volta nella costruzione dinamica dello statement, almeno in una buona parte dei casi. 

Certo è che il miglioramento è significativo, infatti la semplificazione introdotta da TOP(n) ci permette di concentrarci maggiormente nei pericoli della concatenazione di stringhe SQL sperando di non commettere errori.

powered by IMHO 1.2


per leggere il post originale o inviare un commento visita il seguente indirizzo: Paginare i record con SQL Server 2005