存储过程分页

           一次从数据库的表里取多少数据出来和GridView或者DataGrid绑定或者其他容器,这可能是每个程序员都会碰到的问题。每个人采取的方式可能不一样,但也都是大同小异。
其中可以用到一种很简单的子查询来实现这个过程,SQL语句:

Select Top [数字]  Field1,Field2,.... From [表名] Where PK Not In (Select Top  [数字]*PK From [表名])

^_^【数字】需要做处理,应该不用我细说了吧,其实想想这样做到话如果取第901-1000之间的100条记录,那不是要将前面的900条全遍历完以后才能拿到目标数据。把这个效果扩大一下,如果有100000000...... 总之很多了,取越靠后的数据遍历的数据也越多,那样和一次将数据全取出的效果也差不多了。所以这个只能适应较少数据的情况,那么当数据量大了怎么办呢,可以参考下面:

ALTER PROCEDURE [dbo].[usp_GetPageRecord]
 @pageIndex int,              --从第几行记录开始分页
 @returnPageNumber int  --每页要返回的记录行数
AS
Declare Cursor_Page SCROLL Cursor
For
SELECT Fied1,Filed2,Fied3 FROM valueTest

Open Cursor_Page

declare
@a1 varchar(50),         --用于向临时表转数据的变量,对应表的第1个字段
@a2 varchar(50),         --用于向临时表转数据的变量,对应表的第2个字段
@a3 varchar(50),         --用于向临时表转数据的变量,对应表的第3个字段
@i int ,         --一个用于循环的变量
@t int,          --该变量用于游标定位
@rowCount int    --对应表记录总数

set @i=1 --初始化循环变量
select @rowCount=count(*) from valueTest

create table #b(ID int,ValueY varchar(50),CientID int)--构建临时表b

while @i<=@returnPageNumber                  --开始添充临时表的循环
begin
set @t=@pageIndex + @i  --指定开始的记录数
if @t>@rowCount break
FETCH ABSOLUTE @t from Cursor_Page into @a1,@a2,@a3 --使用游标所在行的记录充临时变量

insert into #b(ID,ValueY,CientID) values(@a1,@a2,@a3)  --将临时变量值存入临时表中

set @i=@i+1 --记数器变里加1

end           ---------------------------------结束循环

select ID,ValueY,CientID from #b       --存储过程所返回的表,即分页数据
drop table #b              --销毁临时表
close Cursor_Page      --关闭游标
deallocate Cursor_Page --销毁游标

这其中可以将表名做修改,就满足自己的需求了。参数也需要办法修改,那样就能适合整个项目,而不是针对单表分页了,嘻嘻,留给大家发挥了。

posted @ 2008-06-12 10:41  逆天寒  阅读(245)  评论(0编辑  收藏  举报