sybase分页的实现

create procedure splitpage_sybase @qry varchar(16384),@ipage int,

@num int,@maxpages int = 5000 as

/*@qry SQL语句, @ipage 页数, @num 每页记录条数, @maxpages 最大查询页数 */

begin

declare @rcount int

declare @execsql varchar(16384)

if @ipage > @maxpages

begin

select '输入页数[' || convert(varchar,@ipage) || ']大于最大查询页数['

|| convert (varchar,@maxpages) ||']'

return

end

select @rcount=@ipage*@num

set rowcount @rcount

--将查询语句的select 替换成 select sybid=identity(12),

set @execsql = stuff(@qry,charindex('select',@qry),6,'select sybid=identity(12),')

--将查询语句的from替换成into #temptable1 from,先将查询结果存放到临时表#temptable1

set @execsql = stuff(@execsql, charindex('from',@execsql),4,'into #temptable1 from')

--重组sql语句,分页的核心控制处

set @execsql = @execsql || ' select * from #temptable1 where sybid >'

|| convert(varchar,(@ipage-1)*@num) || ' and sybid <= '

|| convert(varchar,@ipage*@num)

execute (@execsql)

set rowcount 0

end

执行存储过程splitpage_sybase即可。

exec splitpage_sybase ‘sql查询语句’,1,100,1000

实现原理:

1) 将原始sql查询语句的select,替换成select sybid=identity(12),目的是引入分页的记录数控制值;

2) 将原始sql查询语句的from,替换成into #temptable1 from,目的是将查询结果存入临时表#temptable1

3) 重组原始sql查询语句,加上' select * from #temptable1 where sybid >'

|| convert(varchar,(@ipage-1)*@num)

|| ' and sybid <= '

|| convert(varchar,@ipage*@num),实现真正的分页。

注意事项:

1)由于该分页实现是操作临时表#temptable1核心字段sybid实现的,而sybase数据库一张数据表只能有一个identity字段,因此原始查询结果中如果包含identity字段就会有问题。如遇到原始查询结果中包含identity字段,那么须将改字段convert成其它类型。

你可能感兴趣的:(sql,Sybase)