最近msdn magazine上的一篇文章10 tips for writing high-performance web applications提到了有效的数据分页技术对提高asp .net程序性能的重要性;并给出了一个实现数据分页的stored procedure的例子,抄录如下:
create procedure northwind_orderspaged
(
@pageindex int,
@pagesize int
)
as
begin
declare @pagelowerbound int
declare @pageupperbound int
declare @rowstoreturn int
— first set the rowcount
set @rowstoreturn = @pagesize * (@pageindex + 1)
set rowcount @rowstoreturn
— set the page bounds
set @pagelowerbound = @pagesize * @pageindex
set @pageupperbound = @pagelowerbound + @pagesize + 1
— create a temp table to store the select results
create table #pageindex
(
indexid int identity (1, 1) not null,
orderid int
)
— insert into the temp table
insert into #pageindex (orderid)
select
orderid
from
orders
order by
orderid desc
— return total count
select count(orderid) from orders
— return paged results
select
o.*
from
orders o,
#pageindex pageindex
where
o.orderid = pageindex.orderid and
pageindex.indexid > @pagelowerbound and
pageindex.indexid < @pageupperbound
order by
pageindex.indexid
end
在sql server 2000里面,由于没有一个有效的进行ranking操作的方法,所以该例子先创建了一个有identity字段的临时表,利用identity字段的自增长特性,间接的为orders表的每一行按orderid逆序赋予了一个行号, 然后基于这个行号实现分页。
在sql server 2000里面,由于系统提供了内建的ranking函数,为了给orders表生成行号,我们不再需要利用identity字段。
例如,利用sql server 2000的row_number()函数,按orderid字段逆序排列,给orders表生成行号的语句如下:
select row_number() over(order by ordered desc) as rownum, ordered
from orders
order by rownum desc
基于这些新的ranking函数,您可以跟方便的实现数据的分页操作。
