sybase 存储过程分页(转)

本文详细介绍了Sybase数据库端分页的基本思路,并提供了多种实现方法,包括使用TOP关键字、存储过程实现分页、创建临时表获取数据等。重点展示了通过存储过程实现分页的两种方式,并提供了相关代码示例。

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

sybase数据库端分页
基本的思路有如下几种:

从12.5.3版本开始sybase支持top关键字,试着使用,但是未果(同事说sybase对top支持不好),因为不支持嵌套。使用的是如下的sql:
select top 10 t1.AH, t1.BH from K_ZS..B_MS t1 where t1.BH not in (select top 20 t2.BH from K_ZS..B_MS t2)
这里的是不带order by的,另外一种是带order by的,效率会比较高。
在存储过程端使用set rowcount 来实现分页,没有试验。
用存储过程,建立临时表,获取数据,然后动态sql获得临时表数据。最后从网上找到的如下的两个分页存储过程:
-- 按行读取

Java代码 复制代码 收藏代码
  1. CREATE PROCEDURE GetDataByLine
  2. (
  3. --创建一个分页读取过程
  4. @SqlStr varchar(8000), --SQL语句
  5. @FirstRec int, --页起始行
  6. @LastRec int --页结束行
  7. )
  8. AS
  9. DECLARE @dt varchar(10) --生成临时表的随机数
  10. BEGIN
  11. SELECT @dt= substring(convert(varchar, rand()), 3, 10) --一个字符型的随机数
  12. --将搜索结果放入临时表中,表名随机生成,在' FROM '前插入'INTO '+随机临时表名
  13. SELECT @SqlStr = stuff(@SqlStr,charindex(' FROM ', upper(@SqlStr)), 6, ' INTO tempdb..Lining' + @dt + ' FROM ')
  14. --stuff(string要被替换的字符串,int 起始位置, int 字符串长度, string用于替换的 字符串)
  15. -- CHARINDEX ( expression1 , expression2 [ , start_location ] )
  16. -- Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。
  17. -- select * from tbl_user; 替换后为 select * INTO tempdb..Lining @dt FROM tbl_user;
  18. EXECUTE (@SqlStr)
  19. --为临时表增加id号
  20. SELECT @SqlStr = 'ALTER TABLE tempdb..Lining' + @dt + ' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
  21. EXECUTE (@SqlStr)
  22. --计算临时表中的记录数
  23. --SELECT @SqlStr = 'SELECT Count(*) From tempdb..Lining' + @dt
  24. --EXECUTE (@SqlStr)
  25. --选取记录号在起始行和结束行中间的记录
  26. SELECT @SqlStr = 'SELECT * FROM tempdb..Lining'+@dt+' WHERE TEMPDB_ID > ' + convert(varchar, @FirstRec) + ' and TEMPDB_ID <= ' + convert(varchar, @LastRec)
  27. EXECUTE (@SqlStr)
  28. --删除临时表
  29. SELECT @SqlStr = 'DROP TABLE tempdb..Lining'+@dt
  30. EXECUTE (@SqlStr)
  31. END
CREATE PROCEDURE GetDataByLine
(
                                      --创建一个分页读取过程
    @SqlStr         varchar(8000),    --SQL语句
    @FirstRec       int,              --页起始行
    @LastRec        int               --页结束行
)
AS
DECLARE @dt varchar(10)    --生成临时表的随机数
BEGIN

    SELECT @dt= substring(convert(varchar, rand()), 3, 10)    --一个字符型的随机数
    
    --将搜索结果放入临时表中,表名随机生成,在' FROM '前插入'INTO '+随机临时表名
    
    SELECT @SqlStr = stuff(@SqlStr,charindex(' FROM ', upper(@SqlStr)), 6, ' INTO tempdb..Lining' + @dt + ' FROM ')
    --stuff(string要被替换的字符串,int 起始位置, int 字符串长度, string用于替换的          字符串)
    -- CHARINDEX ( expression1 , expression2 [ , start_location ] )
    -- Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。
    -- select * from tbl_user; 替换后为 select * INTO tempdb..Lining @dt FROM tbl_user;
    
    EXECUTE (@SqlStr)
    
    --为临时表增加id号
    SELECT @SqlStr = 'ALTER TABLE tempdb..Lining' + @dt + ' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
    EXECUTE (@SqlStr)
    
    --计算临时表中的记录数
    --SELECT @SqlStr = 'SELECT Count(*) From tempdb..Lining' + @dt
    --EXECUTE (@SqlStr)
    
    --选取记录号在起始行和结束行中间的记录
    SELECT @SqlStr = 'SELECT * FROM tempdb..Lining'+@dt+' WHERE TEMPDB_ID > ' + convert(varchar, @FirstRec) + ' and TEMPDB_ID <= ' + convert(varchar, @LastRec)
    EXECUTE (@SqlStr)
    
    --删除临时表
    SELECT @SqlStr = 'DROP TABLE tempdb..Lining'+@dt
    EXECUTE (@SqlStr) 
  
END

/*
some comments:
1.@SqlStr varchar(8000), depends on your page size
2. this is a generic paging sp, if you just want to use it for specific table,
you'd better change the 'tempdb..Lining' to #Paging, the performance will be better
*/ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值