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成其它类型。



Reference:

http://www.xuebuyuan.com/1626555.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值