不按主键排序的存储过程分页代码
很久没有在这里发表原创帖了,但这也可能会是我在这里发表的最后一个关于分页过程的帖。记得以前共发表过三个关于大量数据分页的代码。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]]