post icon

TSQL query Skip and Take – Utile per visualizzazioni paginate

Oggi vediamo come utilizzare la funzione di sistema ROW_NUMBER() disponibile dalla versione di SQL 2005 in poi per effettuare delle quary che prendono il nome di Skip and Take. Questa metodologia è stata introdotta con LINQ e consente di recuperare solo un certo numero di record, ad esempio utile per la paginazione in una griglia. Supponiamo di avere 1 milione di record in una tabella e vogliamo creare una griglia paginata, questo è il caso migliore di utilizzo di Skip and Take per evitare di selezionare tutti i record già dalla prima pagina. In pratica si imposta il lumero di record che si vuole estrarre (@QUNTI) e a partire da quele elemento (@DA). Di seguito il codesnippet T-SQL:

USE [Northwind]
GO

DECLARE @DA BIGINT, @QUANTI BIGINT

SET @DA = 1
SET @QUANTI = 10       

SELECT *
FROM(
  SELECT [CustomerID]
        ,[CompanyName]
        ,[ContactName]
        ,[ContactTitle]
        ,[Address]
        ,[City]
        ,[Region]
        ,[PostalCode]
        ,[Country]
        ,[Phone]
        ,[Fax]
        ,ROW_NUMBER() OVER (ORDER BY [CustomerID]) AS ROWNUM
   FROM [Customers]
 ) AS SKTK
WHERE SKTK.ROWNUM BETWEEN @DA AND (@DA + @QUANTI - 1)

Quindi, nel caso della griglia paginata con 10 record per pagina si avrà:

  • Pagina 1: @DA = 1, @QUANTI = 10
  • Pagina 2: @DA = 11, @QUANTI = 10
  • Pagina n: @DA = n * @QUANTI – @QUANTI + 1, @QUANTI = 10

Enjoy snippet!

31 marzo 2010 @ 10:29

2 Comments

Leave a comment
  1. Marco
    13 settembre 2011 at 15:41 #

    Il ROW_NUMBER() è utilissimo anche nella versione

    OVER (PARTITION BY [CustomerID] ORDER BY [CustomerID])

    per raggruppare per “CustomerID”.

  2. Nicola Celiento
    28 dicembre 2013 at 12:09 #

    Vero, utilissimo!

    Con PARTITION BY [CustomerID] stai dicendo alla funzione ROW_NUMBER() di ricominciare il conteggio ad ogni cambio di [CustomerID]

Leave a Reply

Are you human? Time limit is exhausted. Please reload CAPTCHA.