CREATEprocedure pagination1 (@pagesize int, --页面大小,如每页存储20条记录 @pageindex int--当前页码 ) as set nocount on begin declare @indextable table(id intidentity(1,1),nid int) --定义表变量 declare @PageLowerBound int--定义此页的底码 declare @PageUpperBound int--定义此页的顶码 set @PageLowerBound=(@pageindex-1)*@pagesize set @PageUpperBound=@PageLowerBound+@pagesize setrowcount @PageUpperBound insertinto @indextable(nid) select gid from TGongwen where fariqi >dateadd(day,-365,getdate()) orderby fariqi desc select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t where O.gid=t.nid and t.id>@PageLowerBound and t.id<=@PageUpperBound orderby t.id end set nocount off
declare @pageSize int--返回一页的记录数 declare @CurPage int--页号(第几页)0:第一页;-1最后一页。 declare @Count int declare @id int set @pageSize=10 set @CurPage =1 --定位 if @CurPage =-1 begin --最后一页 setrowcount @pageSize select @id=newsID from newsTemp orderby newsID end if @CurPage >0 begin set @Count = @pageSize * (@CurPage -1) +1 setrowcount @Count select @id=newsID from newsTemp orderby newsID desc end --返回记录 setrowcount @pageSize select*from newsTemp where newsID <=@id orderby newsID desc setrowcount0
思路:就是上面的算法的延续,就是说呢避免使用 not in 和 max 的方法。
也就是这个思路:Select top 10 * from table1 where id>200
定位 —— 就是说要找到“临界点”,分页的临界点。找到了之后剩下的事情就好办了。
缺点:单字段排序、排序字段的值不能重复(不是绝对不能重复,可以有少量的重复)。
2、通用法 —— 颠颠倒倒法
有的时候“定位法”的缺点是不可以接受的,但是没有关系,可以用这个的。
select*fromtablewhere id in ( selecttop10 ID from ( selecttop20 ID,addedDate fromtable orderby addedDate desc ) as aa orderby addedDate ) orderby addedDate desc