您的位置:首页 > 其它

分页存储过程:排序反转分页法

2005-12-19 14:05 405 查看
/* -- [排序反转分页法]分页存储过程 --
---------- Summary ----------------
在这个采用排序反转分页法实现的分页存储过程中,
①若当前为第一页,则直接取出记录;②若当前页码大于总页码,则返回空结构;
③若当前页码的2倍小于或等于总页码,
则先按排序规则截取前n[n=当前页码*每页条数]条记录形成视图1,
接着截取视图1中的后m[m=每页条数]条形成视图2(实际操作是反转排序规则,取前m条),
最后再次反转排序规则(负负得正,用默认排序规则就可以了)截取视图2中的前m[m=每页条数]条形成视图3,
视图3中的记录就是我们想要的结果;
④若当前当前页码的2倍大于总页码,
则按排序规则截取后n[n=总记录-(当前页码-1)*每页条数]条记录形成视图1(实际操作是反转排序规则,取前n条),
然后按默认排序规则截取视图1中的前m[m=每页条数]条形成视图2
视图2中的记录就是我们想要的结果。
———— 丛兴滋(cncxz) 2005.12.19

----特别感谢windwang和fyw的帮助

---------------------------------------------------
*/

CREATE PROCEDURE [dbo].[OrderUpendPager]
@PageCurr int=1, --当前页码
@PageSize int=10, --每页条数
@QueryString varchar(5000), --查询字符串
@OrderString varchar(5000), --排序规则
@FieldShow varchar(5000), --要显示的字段
@RecordCount int output --总记录条数

AS
declare @ViewName varchar(100) --临时查询视图名称
set @ViewName='tempView'
declare @RecordQuery varchar(5000) --记录查询
declare @OrderUpend varchar(5000) --排序规则反转

if(@FieldShow='' or @FieldShow=null)
set @FieldShow='*'
if(@PageCurr=0 or @PageCurr=null)
set @PageCurr=1
if(@PageSize=0 or @PageSize=null)
set @PageSize=10

if(@OrderString='' or @OrderString=null)
begin
print('Err:必须设置排序规则--')
return
end

--反转排序规则开始--
if( charindex(',',@OrderString)=0 )
begin
if(charindex(' desc',@OrderString)=0)
set @OrderUpend=replace(@OrderString,' asc','')+' desc'
else
set @OrderUpend=replace(@OrderString,' desc','')
end
else
begin
set @OrderUpend=''
DECLARE @strSingle varchar(100)
DECLARE @strTemp varchar(1000)
DECLARE @strSpace varchar(10)
set @strSpace=''
set @strTemp=@OrderString

while @strTemp<>''
begin
if(charindex(',',@strTemp)=0)
begin
set @strSingle=@strTemp
set @strTemp=''
end
else
begin
set @strSingle=substring(@strTemp,1,charindex(',',@strTemp)-1)
set @strTemp=substring(@strTemp,charindex(',',@strTemp)+1,8000)
end

if(charindex(' desc',@strSingle)=0)
set @strSingle=replace(@strSingle,' asc','')+' desc'
else
set @strSingle=replace(@strSingle,' desc','')
print(@strSingle)
set @OrderUpend=@OrderUpend+@strSpace+@strSingle
set @strSpace=','

end
end
--反转排序规则结束--
print('排序规则:'+@OrderString)
print('反 转 后:'+@OrderUpend)

--统计记录数开始--
create table #tempTBcount(myCount int)
exec('insert into #tempTBcount select count(0) from ( '+@QueryString+' ) '+@ViewName+'')
select @RecordCount=mycount from #tempTBcount drop table #tempTBcount
--统计记录数结束--

declare @PageCount int --总页数
DECLARE @PassRecordCount int --预先取出的记录数
if(@RecordCount%@PageSize=0)
set @PageCount=@RecordCount/@PageSize
else
set @PageCount=(@RecordCount-@RecordCount%@PageSize)/@PageSize+1

if (@PageCurr=1)
begin
set @RecordQuery='select top '+CONVERT(nvarchar, @PageSize)+' '+@FieldShow+' from ('+
@QueryString+') '+@ViewName+'_1 order by '+@OrderString
print('只是显示第一页数据')
print('实际执行的查询为:'+@RecordQuery)
exec(@RecordQuery)
return
end

if(@PageCurr>@PageCount)
begin
set @RecordQuery='select top 0 '+@FieldShow+' from('+
@QueryString+') '+@ViewName
print('总记录显示不了这么多页')
print('实际执行的查询为:'+@RecordQuery)
exec(@RecordQuery)
return
end

if(@PageCurr * 2<=@PageCount)
begin
set @PassRecordCount=@PageCurr*@PageSize
set @RecordQuery=' select top '+CONVERT(nvarchar, @PageSize)+' '+@FieldShow+' from ( '+
'select top '+ CONVERT(nvarchar, @PageSize) +' * from ( '+
'select top '+ CONVERT(nvarchar, @PassRecordCount) +' * from ( '+
@QueryString+' ) '+@ViewName+'_1 order by '+@OrderString+
') '+@ViewName+'_2 order by '+@OrderUpend+
') '+@ViewName+'_3 order by '+@OrderString

print('头部截取')
print('实际执行的查询为:'+@RecordQuery)
exec(@RecordQuery)
end

else
begin
set @PassRecordCount=@RecordCount-(@PageCurr-1)*@PageSize
set @RecordQuery=' select top '+CONVERT(nvarchar, @PageSize)+' '+@FieldShow+' from ( '+
'select top '+ CONVERT(nvarchar, @PassRecordCount) +' * from ( '+
@QueryString+' ) '+@ViewName+'_1 order by '+@OrderUpend+
') '+@ViewName+'_2 order by '+@OrderString
print('尾部截取')
print('实际执行的查询为:'+@RecordQuery)
exec(@RecordQuery)
return
end

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: