通用的分页储存过程

介绍了一个高效的SQL分页存储过程,适用于大量数据的快速分页查询。该过程通过灵活配置表名、字段、条件等参数实现定制化分页,经测试在百万级数据量下仍能保持亚秒级响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       在列出大量数据时经常要对数据进行分页,下面是一个通用的储存过程,性能还是比较好的,经测试100万条数据的表,从中读每页的数据不到1秒,查询条件尽量用索引列,现拿出来与大家分享.

 

create proc GetPageList
(
       @table varchar(20),           --表名(视图名),必写
       @showFileds varchar(150),     --需显示的字段,必写
       @keyFiled varchar(30),        --是数字类型的主键(或唯一标识记录的数字类型字段),必写
       @pageSize int,                --每页的记录数,必写
       @currentPage int,             --当前页,必写
       @whereStr varchar(100),       --查询的条件
       @orderByFiled varchar(30),    --排序的字段
       @orderMethod int              --排序的顺序,1为升序,0为降序,,必写.如果@orderByFiled为空则默认是按主键从小到大排序
)
as
begin
        declare @sql nvarchar(800)
        declare @inWhereStr varchar(100)
        declare @outWhereStr varchar(100) 
        declare @orderByStr varchar(100)
        declare @comparisonChar varchar(2)
       
        set @comparisonChar = '>'
 if @whereStr <> ''
   begin
       set @inWhereStr = ' where ' + @whereStr
       set @outWhereStr = ' and ' + @whereStr
   end
 else
   begin
       set @inWhereStr = ''
       set @outWhereStr = ''
   end

 if @orderByFiled <>''
          begin
               if @orderMethod = 1
                    set @orderByStr = ' order by ' + @orderByFiled + ' asc '
                else if @orderMethod = 0
                   begin
                      set @orderByStr = ' order by ' + @orderByFiled + ' desc '
                      set @comparisonChar = '<'
                   end
          end
        else
          begin
                 set @orderByStr = ' order by ' + @keyFiled + ' asc '
          end

 set @sql = 'select top '+cast( @pageSize as varchar(10)) + ' '+ @showFileds +' from ' + @table + ' where '+ @keyFiled+@comparisonChar
 set @sql = @sql + '(select max('+ @keyFiled +') from (select top ' + cast(@pageSize * (@currentPage - 1) as varchar(10))
 set @sql = @sql + ' '+ @keyFiled +' from ' + @table +  @inWhereStr + @orderByStr +') t)'
 set @sql = @sql + @outWhereStr + @orderByStr
 exec(@sql)
end

 

调用如下:

 exec GetPageList 'Corporations','MemberId,CropName,CropAddress,CityCode,AvoidFlag','MemberId',100,40,'CityCode>=50 And AvoidFlag=2','MemberId',0
exec GetPageList 'Corporations','MemberId,CropName,CropAddress,CityCode,AvoidFlag','MemberId',100,40,'','',1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值