您的位置:首页 > 其它

通用的分页储存过程

2008-10-10 19:20 375 查看
在列出大量数据时经常要对数据进行分页,下面是一个通用的储存过程,性能还是比较好的,经测试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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: