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

/*
******************************************************************************************
  过程名称:Common_ColumnType_Pagination
  过程功能:
  代码设计:小朱(zsy619@163.com)
  设计时间: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-1AS 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-1AS 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
posted @ 2006-01-05 09:14  迪克猪  阅读(548)  评论(0编辑  收藏  举报