找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 285|回复: 4

不按主键排序的存储过程分页代码

[复制链接]
发表于 2010-1-10 06:37:30 | 显示全部楼层 |阅读模式 IP:江苏扬州
很久没有在这里发表原创帖了,但这也可能会是我在这里发表的最后一个关于分页过程的帖。记得以前共发表过三个关于大量数据分页的代码。

    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("adodb.command")
recom.activeconnection = Conn
recom.commandtype = 4

recom.commandtext = "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
发表于 2010-1-10 06:37:34 | 显示全部楼层 IP:江苏扬州
自己再顶一下吧,希望是对大家有用的东西不沉下去!
回复

使用道具 举报

发表于 2010-1-10 06:37:38 | 显示全部楼层 IP:江苏扬州


没人支持……好冷清
回复

使用道具 举报

发表于 2010-1-10 06:37:42 | 显示全部楼层 IP:江苏扬州
支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 13:27 , Processed in 0.327955 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表