一个用存储过程实现数据分页显示的例子,有更合适的请朋友们跟帖啊

用数据库倥件去实现数据分页有时候会遇到性能问题,因为T_Sql语句自己还比较熟悉,所以我想充分挖掘数据库的潜力,Sql server 2005蛮好用的,可不能让它闲着啊。前台程序想每页现实10行数据,下面是个简单的示例:

--假设我的数据表示这样的
create table tb(id int not null identity(1,1primary key,aa varchar(100))
go
create procedure Tb_GetList
(
    
@PageIndex int,     --起始页
    @PageRowCount int    --每页显示的数据行数
)
AS
BEGIN
    ;
With pt(Idx,RowNum) as 
    (
        
Select id,ROW_NUMBER() OVER(ORDER BY id)
        
From tb
    ) 
    
Select top (@PageRowCount) t.* from tb t,pt p where t.id=p.idx and p.RowNum>(@PageIndex-1)*@PageRowCount
END
go

--如果是sql server 2000,存储过程可以这样写:
Alter procedure Tb_GetList
(
    
@PageIndex int,     --起始页
    @PageRowCount int    --每页显示的数据行数
)
AS
BEGIN
    
declare @pt table(Idx int,RowNum int identity(1,1)) 
    
Insert into @pt(Idx) Select Id from tb order by id 
    
Select top (@PageRowCount) t.* from tb t,@pt p where t.id=p.idx and p.RowNum>(@PageIndex-1)*@PageRowCount
END
Go

exec Tb_GetList 1,10    --第一页数据
exec Tb_GetList 2,10    --第二页数据
exec Tb_GetList 3,10    --第三页数据

有人会说,干嘛不直接用表的自增子段来做分页的索引呢?因为自增子段的在数据删除后,是不连续的,所以我一般是用一个表的主键来做分页的索引,让他们按照查询条件顺序或倒序排列,在一个集合或临时表里给一个连续的编号,通过这编号来计算那些数据需要现实,这比把数据一股脑的全获取出来,通过前台的数据控件来分页应该要好得多,想一下,一个表有10个子段,其中几个字段存放大数据,有10万行数据,一次性返回,大概没有10秒以上是搞不定的,大概第一次就超时了,所以这个时候就不能指望那些dbgrid,gridview什么了。

     大家还有没有更好的方法,可以告诉小弟一下?

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页