Paginando dentro de SQLServer 2005
En muchas ocaciones es necesario hacer una paginacion, esta podria estar del lado de la aplicacion o bien del servidor, en este post no haremos un debate de donde es mejor ponerlo pero si mostrare dos ejemplos de paginacion para SQL2005
Primer Ejemplo
Use
AdventureWorks
go
declare @pageNum
int,@RowsPerPage
int
set
@pageNum
= 2
Set @RowsPerPage = 20
select
* from
(
SELECT
row_number() over (order by CustomerID
) as rownum
,
Sales.SalesOrderHeader.* FROM Sales.SalesOrderHeader
)
as p
where
rownum
between
(
@pageNum
- 1
)*@RowsPerPage
+ 1
and
@pageNum
*@RowsPerPage
Este ejemplo es un simple select que utiliza nuevas funciones de SQL2005 como son las de ranking (row_number() en este caso) y se definen 2 variables donde una es la cantidad de registros por pagina y la otra es a la pagina que deseo entrar.
Segundo Ejemplo:
CREATE
FUNCTION dbo
.fn_GetTopOrders
(@custid
AS int, @n
AS INT)RETURNS TABLE
AS
RETURN
SELECT
TOP(@n
) *
FROM
Sales
.SalesOrderHeader
WHERE
CustomerID
= @custid
ORDER
BY TotalDue
DESC
GO
Probando el ejemplo:
declare
@pageNum
int,@RowsPerPage
int
set
@pageNum
= 4
Set
@RowsPerPage
= 20
;
WITH
CTE
as
(
SELECT
C
.CustomerID
,
O.TotalDue,
rank
() over (partition by C
.CustomerID
order by TotalDue
) as rankOfSale
FROM
AdventureWorks.Sales.Customer AS C
CROSS
APPLY
AdventureWorks.dbo.fn_GetTopOrders(C.CustomerID, 3) AS O
)
Select
* from
(
SELECT
row_number() over (order by CustomerID
) as rownum
,
CustomerID,
[1] as Rank1,
[2] as Rank2,
[3] as Rank3
from
CTE
pivot(
sum(TotalDue
) for rankOfSale
in ([1]
,[2]
,[3]
)
)
as pvt
)
as P
where
rownum
between
(
@pageNum
- 1
)*@RowsPerPage
+ 1
and
@pageNum
*@RowsPerPage
Espero les sea de utilidad