分页存储过程


自己写个一个分页存储过程,相对来说效率还可以。


Create PROCEDURE [dbo].[SplitPager]
@tblname VARCHAR(255), -- 表名

@strGetFields varchar(1000= '*'-- 需要返回的列

@PrimaryKey varchar(255)='ID',--主键

@sortField varchar(255)=''-- 排序的字段名

@PageSize int = 10-- 页尺寸

@PageIndex int = 1-- 页码

@doCount bit = 0-- 返回, 非0 值则返回记录总数

@OrderType bit = 0-- 设置排序类型, 非0 值则降序

@strWhere varchar(1500= '' -- 查询条件(注意: 不要加where)

AS

declare @strSQL varchar(5000-- 主语句

declare @strTmp varchar(110-- 临时变量

declare @strOrder varchar(400-- 排序类型

if @doCount != 0

begin

   
if @strWhere !=''

    
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 '+ @strWhere

   
else

    
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'

end --以上代码的意思是如果@doCount传递过来的不是,就执行总数统计。以下的所有代码都是@doCount为的情况:

else

begin

   
if @OrderType != 0--降序

   
begin

    
set @strTmp = ' not exists( select'

    
set @strOrder = ' order by [' + @sortField +'] desc'--如果@OrderType不是0,就执行降序,这句很重要!

   
end

   
else

   
begin

    
set @strTmp = ' not exists( select'

    
set @strOrder = ' order by [' + @sortField +'] asc'

   
end

    
if @sortField<>@PrimaryKey --如果排序字段不是ID 则不添加以免重复出错
    begin
        
set @strOrder=@strOrder+',['+@PrimaryKey+'] desc' 
    
end

   
if @PageIndex = 1

   
begin

    
if @strWhere != ''

     
set @strSQL = 'select top ' + str(@PageSize+' ' + @strGetFields + ' from [' + @tblName + '] where 1=1 ' + @strWhere + ' ' + @strOrder

    
else

     
set @strSQL = 'select top ' + str(@PageSize+' ' + @strGetFields + ' from [' + @tblName + '' + @strOrder--如果是第一页就执行以上代码,这样会加快执行速度

   
end

   
else

   
begin--以下代码赋予了@strSQL以真正执行的SQL代码
        
    
if @strWhere != ''
        
begin
        
set @strSQL = 'select top ' + str(@PageSize+' '+@strGetFields+ ' from [' + @tblName + '] as a where ' + @strTmp + '['+@PrimaryKey+'] from (select top ' + str((@PageIndex-1)*@PageSize+ ' ['+@PrimaryKey+'] from [' + @tblName + '] where 1=1 ' + @strWhere + ' ' + @strOrder + ') as b where a.'+@PrimaryKey+'=b.'+@PrimaryKey+') and 1=1 ' + @strWhere + ' ' + @strOrder 
        
end    
    
else
        
begin
        
set @strSQL = 'select top ' + str(@PageSize+ ' ' + @strGetFields + ' from ['   + @tblName + '] as a where '+ @strTmp + '['+@PrimaryKey+'] from (select top ' + str((@PageIndex-1)*@PageSize+ ' ['+@PrimaryKey+'] from [' + @tblName + ']' + @strOrder + '  ) as b where a.'+@PrimaryKey+'=b.'+@PrimaryKey+')' + @strOrder 
        
end
   
end 

   
if @strWhere !=''            --得到记录的总行数

    
set @strSQL =@strSQL+ '; select count(*) as Total from [' + @tblName + '] where 1=1 '+ @strWhere

   
else

    
set @strSQL =@strSQL+ '; select count(*) as Total from [' + @tblName + ']'

end
print (@strSQL)
exec (@strSQL)

 

posted @ 2011-03-14 14:42  小胆粗心  Views(257)  Comments(0Edit  收藏  举报