bhè, è un'operazione abbastanza semplice grazie alle funzioni di ranking che il sistema ci mette a disposizione.... Tali funzioni consentono una numerazione arbitraria delle righe reperite dalla selezione e nel nostro caso uso la funzione row_number() over(order by campi da ordinare)
use TempDb Go --Creao una tabella contenente le righe su cui effettuare la paginazione Create table dbo.Paginata ( id int identity(0,1), Nome varchar(15) not null, Cognome varchar(20) not null ) ALTER TABLE dbo.Paginata ADD CONSTRAINT PK_Paginata PRIMARY KEY NONCLUSTERED ( Nome, Cognome ) set nocount on declare @i int = 0 --inserisco le righe While @i < 100000 begin insert into Paginata (Nome,Cognome) values('Nome ' + cast(@i as varchar(8)), 'Cognome ' + cast(@i as varchar(8))); set @i = @i + 1 end --Ricerco la centesima pagina declare @pagenumber int= 100 --Ogni pagina mi restituisce 10 righe declare @pagesize int = 10 SELECT TOP (@pagesize) * FROM ( SELECT row_number() over(order by Nome,Cognome) as RowNumber, * FROM Paginata )as A WHERE RowNumber > ((@pagenumber - 1) * @pagesize)
Con la nuova versione SQL Server (ora sto provando la CTP3) il giochino sarà ancora più semplice !!
--Ricerco la centesima pagina declare @pagenumber int= 100 --Ogni pagina mi restituisce 10 righe declare @pagesize int = 10 Select * from Paginata order by Nome,Cognome OFFSET ((@pagenumber - 1) * @pagesize) ROWS FETCH NEXT @pagesize ROWS ONLY;
La sintassi dell'order by ora prevede le clausole Offset e Fetch next che consentono di implementare la paginazione senza utilizzare funzioni di ranking !!!!
Scusate la volgarita ma per me è una figata !!!
Nessun commento:
Posta un commento