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

/*
******************************************************************************************
  过程名称:Common_ColumnType_Pagination
  过程功能:
  代码设计:小朱([email protected])
  设计时间:2005-11-3 13:58:26
******************************************************************************************
  功能描述:

******************************************************************************************
  如果您修改了我的程序,请留下修改记录,以便对程序进行维护,谢谢  !!!
==========================================================================================
  修改人            修改时间                修改原因
------------------------------------------------------------------------------------------

==========================================================================================

******************************************************************************************
  备注:对指定表中满足条件的记录按指定列进行分页查询,分页可以顺序、倒序         
    查询可以指定页大小、指定查询任意页、指定输出字段列表,返回总页数
*****************************************************************************************
*/

Create   Procedure   [ dbo ] . [ Common_ColumnType_Pagination ]
    
@tb           varchar ( 50 ),  -- 表名  
     @col          varchar ( 50 ),  -- 按该列来进行分页  
     @coltype      int ,          -- @col列的类型,0-数字类型,1-字符类型,2-日期时间类型  
     @orderby      bit ,          -- 排序,0-顺序,1-倒序  
     @collist      varchar ( 800 ), -- 要查询出的字段列表,*表示全部字段  
     @pagesize     int ,          -- 每页记录数  
     @page         int ,          -- 指定页  
     @condition    varchar ( 800 ), -- 查询条件  
     @pages        int  OUTPUT    -- 总页数
AS
    
Declare   @intResult   Int
    
Begin   Tran
    
-- ---------------------------------------------------------------代码设计--------------------------------------------------------------------
     DECLARE   @sql   nvarchar ( 4000 ), @where1   varchar ( 800 ), @where2   varchar ( 800 )
    
IF   @condition   is   null   or   rtrim ( @condition ) = ''
    
BEGIN -- 没有查询条件  
         SET   @where1 = '  WHERE  '  
        
SET   @where2 = '    '
    
END
    
ELSE
    
BEGIN -- 有查询条件  
         SET   @where1 = '  WHERE ( ' + @condition + ' ) AND  ' -- 本来有条件再加上此条件  
         SET   @where2 = '  WHERE ( ' + @condition + ' ' -- 原本没有条件而加上此条件
     END
    
SET   @sql = ' SELECT @pages=CEILING((COUNT(*)+0.0)/ ' + CAST ( @pagesize   AS   varchar ) +   ' ) FROM  ' + @tb + @where2
    
EXEC  sp_executesql  @sql ,N ' @pages int OUTPUT ' , @pages  OUTPUT -- 计算总页数
     IF   @orderby = 0   
        
SET   @sql = ' SELECT TOP  ' + CAST ( @pagesize   AS   varchar ) + '   ' + @collist +   '  FROM  ' + @tb + @where1 + @col + ' >(SELECT MAX( ' + @col + ' ' +    '  FROM (SELECT TOP  ' + CAST ( @pagesize * ( @page - 1 AS   varchar ) + '   ' +           
         
@col + '  FROM  ' + @tb + @where2 + ' ORDER BY  ' + @col + ' ) t) ORDER BY  ' + @col
    
ELSE   
        
SET   @sql = ' SELECT TOP  ' + CAST ( @pagesize   AS   varchar ) + '   ' + @collist + '  FROM  ' + @tb + @where1 + @col + ' <(SELECT MIN( ' + @col + ' ' +   '  FROM (SELECT TOP  ' + CAST ( @pagesize * ( @page - 1 AS   varchar ) + '   ' +  
        
@col + '  FROM  ' + @tb + @where2 + ' ORDER BY  ' + @col + '  DESC) t) ORDER BY  ' + @col + '  DESC '
    
IF   @page = 1 -- 第一页 
         SET   @sql = ' SELECT TOP  ' + CAST ( @pagesize   AS   varchar ) + '   ' + @collist + '  FROM  ' + @tb +     
            
@where2 + ' ORDER BY  ' + @col + CASE   @orderby   WHEN   0   THEN   ''   ELSE   '  DESC '   END
    
EXEC ( @sql )
    
Set   @intResult   =   @@ROWCOUNT
    
-- --------------------------------------------------------------------------------------------------------------------------------------------------
     If   @@Error   <>   0
    
Begin
        
RollBack   Tran
        
Return   - 1
    
End
    
Else
    
Begin
        
Commit   Tran
        
Return   @intResult
    
End
GO

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