数据库分页存储过程(2)

/*
******************************************************************************************
  过程名称:Common_OrderUpend_Pagination
  过程功能:排序反转分页法实现的分页存储过程
  代码设计:小朱([email protected])
  设计时间: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

你可能感兴趣的:(存储过程)