小成博客

2010年到了...
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

分页存储过程

Posted on 2007-07-05 23:51  成斌  阅读(112)  评论(0)    收藏  举报
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/**//************************************************
分页存储过程
创建日期:2007-7-5
修改日期:2007-7-10
创建人:成斌
***********************************************
*/

CREATE PROCEDURE [dbo].[sp_paging]
    
--定义全局变量
    @tablename      varchar(50),           --表名
    @pagesize       int = 30,              --每页行数
    @page           int = 1,               --页码
    @listfield      varchar(100= '*',    --列出字段(结果中列出的字段)
    @fieldname      varchar(100= 'id',   --查询字段(用哪个字段查询)
    @condition      varchar(800= '',     --查询条件(不包含where)
    @searchtype     int = 0,               --查询类型(0-查询行数,1-查询内容)
    @orderby        bit = 0,               --排序(0-顺序,1-倒序)
    @searchtime     datetime='' OUTPUT     --查询时间
AS
BEGIN
    
set @searchtime = getdate()  --计时开始
    --定义局部变量
    declare
        
@sql     nvarchar(4000),
        
@where1  varchar(800),
        
@where2  varchar(800),
        
@temp1   varchar(800),
        
@temp2   varchar(800)

    
--判断是否有查询条件--
    if @condition = ''
        
begin  --没有查询条件
           set @where1 = ' where '
           
set @where2 = ''
        
end
    
else
        
begin  --有查询条件
            set @where1 = ' where ( ' + @condition + ' ) and '
            
set @where2 = ' where ( ' + @condition + ' ) '
        
end
    
--判断查询类型--
    if @searchtype = 0  --如果类型为0则查询行数,否则查询内容
        begin
            
set @sql = ' select count(*) as ''Page Count'' from ' + @tablename + ' with (nolock) ' + @where2  --计算总行数
        end
    
else
        
begin
            
--判断顺序--
            if @orderby = 0
                
begin
                    
set @temp1 = ' > (select max( '
                    
set @temp2 = ''
                
end
            
else
                
begin
                    
set @temp1 = ' < (select min( '
                    
set @temp2 = ' desc '
                
end
            
--判断输入页码--
            if @page = 1  --如果页码等于1
                begin
                    
set @sql = ' select top ' + cast(@pagesize as varchar+ @listfield + ' 
                        from 
' + @tablename + ' with (nolock) ' + @where2 + ' order by ' + @fieldname + @temp2
                
end
            
else  --如果是其他页码
                begin
                    
set @sql = ' select top ' + cast(@pagesize as varchar+ @listfield + ' 
                        from 
' + @tablename + ' with (nolock) ' + @where1 + ' ( ' + @fieldname + @temp1 + @fieldname + ' ) 
                        from (select top 
' + cast(@pagesize * (@page  - 1as varchar+ @fieldname + ' 
                        from 
' + @tablename + ' with (nolock) ' + @where2 + ' order by ' + @fieldname + @temp2 + ' ) as T)) order by ' + @fieldname + @temp2
                
end
        
end
    
exec(@sql)  --执行SQL
    select datediff(ms,@searchtime,getdate()) as 'Use Time'  --计时结束
END