none
Limitare il numero di righe restituite da una query RRS feed

  • Domanda

  • Buon giorno, vi chiedo un piccolo aiuto : se questa query "Select nome, cognome FROM Clienti" restituisce 25000 righe, esiste un modo di scrivere il testo della query  affinchè mi vengano restituite ad esempio le righe da 1000 a 2000 ?

     

    Grazie.


    mario formosa
    lunedì 20 giugno 2011 11:12

Risposte

  • Salve,

    DECLARE

    @pageNumber

    int,
     

    @PageSize

    int,

     

     

    @FirstRow INT

    ,

    @LastRow

    INT

    SELECT

     

     @FirstRow = @PageNumber * @PageSize + 1, @LastRow = @PageNumber * @PageSize + @PageSize ;

    WITH thisCTE as

    (

     
     

          SELECT field1, field2, field3, ROW_NUMBER() OVER (ORDER BY [SOME_FIELD] ASC) AS RowNumber

     

          FROM SOMETABLE 

    )

    select field1, field2, field3 from thisCTE where RowNumber between

    @FirstRow

    AND @LastRow

    ORDER

     

    BY RowNumber ASC

    ;


    Regards, Nico
    • Contrassegnato come risposta Mario Formosa lunedì 20 giugno 2011 15:09
    lunedì 20 giugno 2011 11:38
  • Se non disturbo troppo, potresti spiegarmi gentilmente in dettaglio la query che restituisce (diciamo così) ThisCTE ?

    Ciao Mario,

    ThisCTE è una Common Table Expression (CTE appunto) che ti permette di generare dei result set temporanei validi nel contesto del comando di SELECT, INSERT, UPDATE e DELETE che segue. Per semplificare puoi considerare una CTE alla stessa stregua di una tabella derivata.

    Le CTE possono essere utilizzare per eseguire in modo estremamente elegante delle query ricorsive.

    ROW_NUMBER è una delle 4 funzioni di Ranking introdotte con SQL Server 2005.

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.technet.microsoft.com/Forums/it-IT/sqlserverit
    • Contrassegnato come risposta Mario Formosa martedì 21 giugno 2011 11:04
    lunedì 20 giugno 2011 19:02
    Moderatore
  • Ciao Mario,
    come Lorenzo ha spiegato , ROW_NUMBER è una funzione di rango, e la dichiarazione OVER è parte di esso. Scusa il mio italiano, è solo google-italiano.

    Regards, Nico
    • Contrassegnato come risposta Mario Formosa martedì 21 giugno 2011 11:04
    martedì 21 giugno 2011 07:07

Tutte le risposte

  • Salve,

    DECLARE

    @pageNumber

    int,
     

    @PageSize

    int,

     

     

    @FirstRow INT

    ,

    @LastRow

    INT

    SELECT

     

     @FirstRow = @PageNumber * @PageSize + 1, @LastRow = @PageNumber * @PageSize + @PageSize ;

    WITH thisCTE as

    (

     
     

          SELECT field1, field2, field3, ROW_NUMBER() OVER (ORDER BY [SOME_FIELD] ASC) AS RowNumber

     

          FROM SOMETABLE 

    )

    select field1, field2, field3 from thisCTE where RowNumber between

    @FirstRow

    AND @LastRow

    ORDER

     

    BY RowNumber ASC

    ;


    Regards, Nico
    • Contrassegnato come risposta Mario Formosa lunedì 20 giugno 2011 15:09
    lunedì 20 giugno 2011 11:38
  • Grazie Nico. Molto interessante ! Se non ho capito male il testo racchiuso nel blocco With espone diciamo così, una tabella identificata col nome thisCTE che poi viene letta dalla SELECT successiva ?

    Scusami ancora un secondo, ROW_NUMBER dovrebbe essere una funzione del linguaggio TSql o no ?

    Quello che proprio non ho capito è la parola OVER.

    Se non disturbo troppo, potresti spiegarmi gentilmente in dettaglio la query che restituisce (diciamo così) ThisCTE ?

     

    Grazie 1000 !


    mario formosa
    lunedì 20 giugno 2011 15:25
  • Se non disturbo troppo, potresti spiegarmi gentilmente in dettaglio la query che restituisce (diciamo così) ThisCTE ?

    Ciao Mario,

    ThisCTE è una Common Table Expression (CTE appunto) che ti permette di generare dei result set temporanei validi nel contesto del comando di SELECT, INSERT, UPDATE e DELETE che segue. Per semplificare puoi considerare una CTE alla stessa stregua di una tabella derivata.

    Le CTE possono essere utilizzare per eseguire in modo estremamente elegante delle query ricorsive.

    ROW_NUMBER è una delle 4 funzioni di Ranking introdotte con SQL Server 2005.

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.technet.microsoft.com/Forums/it-IT/sqlserverit
    • Contrassegnato come risposta Mario Formosa martedì 21 giugno 2011 11:04
    lunedì 20 giugno 2011 19:02
    Moderatore
  • Ciao Mario,
    come Lorenzo ha spiegato , ROW_NUMBER è una funzione di rango, e la dichiarazione OVER è parte di esso. Scusa il mio italiano, è solo google-italiano.

    Regards, Nico
    • Contrassegnato come risposta Mario Formosa martedì 21 giugno 2011 11:04
    martedì 21 giugno 2011 07:07
  • Grazie Lorenzo! Grazie Nico ! Ho provato nel Management Studio a giocare con il testo della CTE e mi sono accorto che OVER diciamo che fa parte di ROW_NUMBER() infatti togliendolo ricevevo un messaggio di errore.

    Mi pare di capire che OVER, che tradotto in italiano significa SOPRA, indica che la numerazione delle righe debba essere effettuata sopra appunto, un ordinamento scelto.

    Adesso mi sembra maggiormente realizzabile,anche per scenari di complessità maggiore, demandare a SqlServer tutto ciò che riguarda l'elaborazione dei dati e l'ottenimento di risultati basati su di essi, in modo da non appesantire le applicazioni, o quantomeno non complicarne lo sviluppo, con codice di elaborazione ulteriore dei dati.

    Capisco anche però che va prestata una certa attenzione affinche poi non sia SqlServer ad essere sovraccaricato.

    Grazie ancora a tutti e che Dio benedica i forum MSDN e la Microsoft.

    Ciao.


    mario formosa
    martedì 21 giugno 2011 11:40