存储过程分页
其中可以用到一种很简单的子查询来实现这个过程,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 --销毁游标
这其中可以将表名做修改,就满足自己的需求了。参数也需要办法修改,那样就能适合整个项目,而不是针对单表分页了,嘻嘻,留给大家发挥了。