| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1508 人关注过本帖, 1 人收藏
标题:不按主键排序的存储过程分页代码
只看楼主 加入收藏
天涯听雨
Rank: 2
来 自:东莞
等 级:论坛游民
威 望:4
帖 子:497
专家分:64
注 册:2007-8-25
结帖率:100%
收藏(1)
 问题点数:0 回复次数:3 
不按主键排序的存储过程分页代码
很久没有在这里发表原创帖了,但这也可能会是我在这里发表的最后一个关于分页过程的帖。记得以前共发表过三个关于大量数据分页的代码。

    PS:进入今天说的主题:

    在许多时候,大量数据的分页一直是让我们头疼的问题,而且分页的时候分随着我们实际的要求而越来越复杂,比如出现的实际情况有:

    1、分页时要求还连接外表

    2、分页要请求的数据大量

    3、分页时排序还要按时间、点击、回复排序(非主键排序)

    今天这里要写的就是面对非主键排序分页问题,而且要利用MSSQL2000 存储过程写

    今天只写出主要代码,详细如何使用,请搜索以前我这里写过的其它分页代码参照看一下。前一版本《不按主键排序的存储过程分页代码》其中存过程中是利用临时表的方法,但考虑利用临时表分页时,会带来大量的IO操作,如果请求频繁时,速度也是让人不满意的,所以这次版本改进在不利用临时表方法。

'本类进行实例化代码,不将所有可能性条件分页考虑进去。本类仅作参考
'--------------------------------------------------------------------------------------------
'PageNo     当前页;
'PageSizeX  分页大小;
'PageCountX 总页数;
'FieldCount 总记录数;
'StrWhere   查询条件;
'StrOrder   排序语句;

Dim PageNo,PageSizeX,PageCountX,FieldCount,StrWhere,StrOrder

'进行赋值
PageNo=trim(Request.Querystring("PageNo"))

PageSizeX=30 '定义分页大小
if isnumeric(PageNo) or PageNo="" then '如果没有Page值,进行初始化值
   PageNo=abs(PageNo)
   if PageNo=0 then PageNo=1
else
   PageNo=1
end if

'特别注意,StrWhere可以为空,但不能不进行赋值,为空时StrWhere="";StrOrder值不能为空,否则存储过程会出错
StrWhere=" (ClassCode=0101 and Hits>20) "
StrOrder=" Order BY Hits desc "


set recom = server.createobject(")
recom.activeconnection = Conn
= 4

= "GetPageRecord"
recom.Parameters.Append recom.CreateParameter("@StrWhere",202,1,200,StrWhere)
recom.Parameters.Append recom.CreateParameter("@StrOrder",202,1,200,StrOrder)
recom.Parameters.Append recom.CreateParameter("@PageSize",3,1,,PageSizeX)
recom.Parameters.Append recom.CreateParameter("@PageIndex",3,1,,PageNo)

set rs = recom.execute ()

if rs.bof and rs.eof then
   set rs=nothing : set recom=nothing : Conn.Close : set Conn=nothing
   response.write "没有找到任何记录"
   response.end
end if

'显示数据
do while not rs.eof
   response.write""&rs("Title")&"   添加时间:"&rs("AddTime")&"<br/>"
   rs.movenext
loop

'取得记录总数,计算页数
set rs = rs.NextRecordset
if  rs("countx") > 0 then
    FieldCount=rs("countx")
else
    FieldCount=0
end if

'记算总页数
if (FieldCount mod PageSizeX)>0 then
    PageCountX=((FieldCount - (FieldCount mod PageSizeX))/ PageSizeX)+1
else
    PageCountX= (FieldCount / PageSizeX)
end if

'进行关闭和释放相关资源
set rs=nothing : set recom=nothing : Conn.Close : set Conn=nothing


'--------------------------------------------------------
'以下代码为存储过程代码
CREATE procedure GetPagingRecord

--分页过程

(
@StrWhere varchar(200),   --条件
@StrOrder varchar(200),   --排序
@PageSize int,            --分页大小
@PageNo int               --当前页码
)

/*
名称:GetPagingRecord
作用:按任意字段进行排序分页
作者:天涯听雨(2008-7-14)
声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明
*/

as
  Begin
 
  declare @Sqlstr  varchar(2000)     -- 主语句
  declare @SqlCountStr varchar(1000) -- 求总记录语句
  declare @SqlWhere varchar(1000)


  if @StrWhere<>""
      Begin
      Set @SqlWhere=" where "+@StrWhere
      End

  set @SqlCountStr="Select Count(ID) as countx from Db_News "+@SqlWhere+""

  set @Sqlstr="Select top "+Cast(@PageSize as varchar) +" ID,Title,NavContent,Author,AddTime from Db_News "+@SqlWhere+" "

  if @PageNo=1 --如要查询为第一页时
     set @Sqlstr=@Sqlstr+@StrOrder
  else
     set @Sqlstr=@Sqlstr+" and  ID not in (Select top "+Cast(@pageSize*(@PageNo-1) as varchar)+" ID from Db_News "+@StrWhere+@StrOrder+" ) "+@StrOrder+" "
   
  exeCute (@Sqlstr)       --执行查询记录
  exeCute (@SqlCountStr)  --执行查询总记录数

  end
GO

[[it] 本帖最后由 天涯听雨 于 2008-7-14 11:22 编辑 [/it]]
搜索更多相关主题的帖子: 代码 
2008-07-14 11:17
天涯听雨
Rank: 2
来 自:东莞
等 级:论坛游民
威 望:4
帖 子:497
专家分:64
注 册:2007-8-25
收藏
得分:0 
自己再顶一下吧,希望是对大家有用的东西不沉下去!

从明天起做幸福的人,喂马劈柴周游世界!
2008-07-14 23:16
madpbpl
Rank: 4
等 级:贵宾
威 望:11
帖 子:2876
专家分:244
注 册:2007-4-5
收藏
得分:0 
支持
2008-07-15 01:56
天涯听雨
Rank: 2
来 自:东莞
等 级:论坛游民
威 望:4
帖 子:497
专家分:64
注 册:2007-8-25
收藏
得分:0 


没人支持……好冷清

从明天起做幸福的人,喂马劈柴周游世界!
2008-07-17 22:13
快速回复:不按主键排序的存储过程分页代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019573 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved