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获得临时表数据。最后从网上找到的如下的两个分页存储过程:
-- 按行读取
/*
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
*/
基本的思路有如下几种:
从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获得临时表数据。最后从网上找到的如下的两个分页存储过程:
-- 按行读取
- 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
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
*/