/**//******************************************************************************************* 过程名称:Common_OrderUpend_Pagination 过程功能:排序反转分页法实现的分页存储过程 代码设计:小朱(zsy619@163.com) 设计时间:2005-11-3 13:58:26****************************************************************************************** 功能描述:****************************************************************************************** 如果您修改了我的程序,请留下修改记录,以便对程序进行维护,谢谢 !!!========================================================================================== 修改人 修改时间 修改原因------------------------------------------------------------------------------------------==========================================================================================****************************************************************************************** 备注: 在这个采用排序反转分页法实现的分页存储过程中, ①若当前为第一页,则直接取出记录;②若当前页码大于总页码,则返回空结构; ③若当前页码的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中的记录就是我们想要的结果。******************************************************************************************/CREATE Procedure [dbo].[Common_OrderUpend_Pagination] @PageCurr int=1, --当前页码 @PageSize int=10, --每页条数 @QueryString varchar(5000), --查询字符串 @OrderString varchar(5000), --排序规则 @FieldShow varchar(5000), --要显示的字段 @RecordCount int output --总记录条数AS Declare @intResult Int Begin Tran -----------------------------------------------------------------代码设计-------------------------------------------------------------------- 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) end else if(@PageCurr>@PageCount) begin set @RecordQuery='select top 0 '+@FieldShow+' from('+@QueryString+') '+@ViewName --print('总记录显示不了这么多页') --print('实际执行的查询为:'+@RecordQuery) exec(@RecordQuery) return @@rowcount end else 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) return @@rowcount 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 @@rowcount end --print @RecordQuery Set @intResult = @@ROWCOUNT ---------------------------------------------------------------------------------------------------------------------------------------------------- If @@Error <> 0 Begin RollBack Tran Return -1 End Else Begin Commit Tran Return @intResult EndGO