数据库分页存储过程(2)
/*
******************************************************************************************
过程名称: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
End
GO
******************************************************************************************
过程名称: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
End
GO