Paginazione dati direttamente da query con SQL Server

MS SQL Server è un ottimo prodotto, ma secondo me ha una grande mancanza:

manca la possibilità di specificare in una query che si vogliono solo le righe dalle 11 alla 20.

Qualcuno potrebbe dire che basta fare un Select top 20 * from ... e poi saltare le prime 10 righe in visualizzazione: sfortunatamente il numero dopo il TOP non è parametrizzabile, quindi non si può fare passare ad una stored procedure.

Ovviamente ci sono altri mille modi per fare paginazione - salvare la datatable nella session, magari anche nella cache se è una query generica (il comunissimo elenco news), ecc... - ma io dovevo per forza mettere nella stored tutta la logica di paginazione: stavo facendo il modulo MS SQL per uno dei progetti opensource al quale collaboro (Jgossip) e il modulo di accesso ai dati era fatto in maniera tale che, nonostante ci fossero N drivers per gli N database supportati, questi drivers contenevano solo le query da passare al DB, e non anche tutta la logica di estrazione.

In pratica dovevo fare in modo di ottenere con MS SQL quello con MySQL si fa semplicemente aggiundo alla fine della query

LIMIT start, pageSize

Questo è il codice della SP che emula il LIMIT di MySQL:

CREATE PROCEDURE  sp_GET_LOG_ENTRIES_ASC

@intimePar varchar(255),
@endtimePar varchar(255),
@loggerPar varchar(255),
@log_levelPar varchar(32),
@remote_ipPar varchar(16),
@session_idPar varchar(255),
@user_namePar varchar(32),
@start int,
@pageSize int

... click here to open ...

In pratica creo una tabella temporanea con i campi che mi servono come risultato, poi dichiaro un cursore e lo apro sulla query vera da fare al DB e, durante il fetch popolo la tabella temporanea solo se le righe sono nell'intervallo richiesto, e alla fine faccio il select sulla tabella temporanea (che contiene solo le righe richieste)

Spero che qualcun'altro possa trarre giovamento da questa mia pazzia in SP.

powered by IMHO

Mio primo entry sul Blog di UGI.NET

Chi sono e perchè posto
«dicembre»
domlunmarmergiovensab
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678