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