基本的思路有如下幾種:
- 從12.5.3版本開(kāi)始sybase支持top關(guān)鍵字,試著使用,但是未果(同事說(shuō)sybase對(duì)top支持不好),因?yàn)椴恢С智短住J褂玫氖侨缦碌膕ql:
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的,效率會(huì)比較高。
- 在存儲(chǔ)過(guò)程端使用set rowcount 來(lái)實(shí)現(xiàn)分頁(yè),沒(méi)有試驗(yàn)。
- 用存儲(chǔ)過(guò)程,建立臨時(shí)表,獲取數(shù)據(jù),然后動(dòng)態(tài)sql獲得臨時(shí)表數(shù)據(jù)。最后從網(wǎng)上找到的如下的兩個(gè)分頁(yè)存儲(chǔ)過(guò)程:
-- 按行讀取
CREATE PROCEDURE GetDataByLine
(
--創(chuàng)建一個(gè)分頁(yè)讀取過(guò)程
@SqlStr varchar(8000), --SQL語(yǔ)句
@FirstRec int, --頁(yè)起始行
@LastRec int --頁(yè)結(jié)束行
)
AS
DECLARE @dt varchar(10) --生成臨時(shí)表的隨機(jī)數(shù)
BEGIN
SELECT @dt= substring(convert(varchar, rand()), 3, 10) --一個(gè)字符型的隨機(jī)數(shù)
--將搜索結(jié)果放入臨時(shí)表中,表名隨機(jī)生成,在' FROM '前插入'INTO '+隨機(jī)臨時(shí)表名
SELECT @SqlStr = stuff(@SqlStr, charindex(' FROM ', upper(@SqlStr)), 6 ,' INTO tempdb..Lining' + @dt + ' FROM ')
EXECUTE (@SqlStr)
--為臨時(shí)表增加id號(hào)
SELECT @SqlStr = 'ALTER TABLE tempdb..Lining' + @dt + ' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
EXECUTE (@SqlStr)
--計(jì)算臨時(shí)表中的記錄數(shù)
--SELECT @SqlStr = 'SELECT Count(*) From tempdb..Lining' + @dt
--EXECUTE (@SqlStr)
--選取記錄號(hào)在起始行和結(jié)束行中間的記錄
SELECT @SqlStr = 'SELECT * FROM tempdb..Lining'+@dt+' WHERE TEMPDB_ID > ' + convert(varchar, @FirstRec) + ' and TEMPDB_ID <= ' + convert(varchar, @LastRec)
EXECUTE (@SqlStr)
--刪除臨時(shí)表
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
*/
-- 按頁(yè)讀取
CREATE PROCEDURE GetDataByPage
(
--創(chuàng)建一個(gè)分頁(yè)讀取過(guò)程
@SqlStr varchar(8000), --SQL語(yǔ)句
@PageSize int, --每頁(yè)記錄數(shù)
@CurrentPage int --當(dāng)前頁(yè)數(shù)
)
AS
DECLARE @FirstRec int, @LastRec int, @dt varchar(10) --頁(yè)起始行,頁(yè)結(jié)束行,生成臨時(shí)表的隨機(jī)數(shù)
BEGIN
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize --計(jì)算頁(yè)起始行
SELECT @LastRec = (@CurrentPage * @PageSize + 1) --計(jì)算頁(yè)結(jié)束行
SELECT @dt= substring(convert(varchar,rand()),3,10) --一個(gè)字符型的隨機(jī)數(shù)
--將搜索結(jié)果放入臨時(shí)表中,表名隨機(jī)生成,在' FROM '前插入'INTO '+隨機(jī)臨時(shí)表名
SELECT @SqlStr = stuff(@SqlStr, charindex(' FROM ',upper(@SqlStr)), 6 ,' INTO tempdb..Paging'+@dt+' FROM ')
EXECUTE (@SqlStr)
--為臨時(shí)表增加id號(hào)
SELECT @SqlStr = 'ALTER TABLE tempdb..Paging'+@dt+' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
EXECUTE (@SqlStr)
--計(jì)算臨時(shí)表中的記錄數(shù)
--SELECT @SqlStr = 'SELECT Count(*) From tempdb..Paging'+@dt
--EXECUTE (@SqlStr)
--選取記錄號(hào)在起始行和結(jié)束行中間的記錄
SELECT @SqlStr = 'SELECT * FROM tempdb..Paging'+@dt+' WHERE TEMPDB_ID > '+convert(varchar,@FirstRec)+' and TEMPDB_ID < '+convert(varchar,@LastRec)
EXECUTE (@SqlStr)
--刪除臨時(shí)表
SELECT @SqlStr = 'DROP TABLE tempdb..Paging'+@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..Paging' to #Paging, the performance will be better
*/
-- 清空日志
Dump Transaction DB_BD With truncate_only
go
use DB_BD
go
if exists( select 1 from sysobjects
where id = object_id( 'PR_GET_PAGESIZE' )
and sysstat & 15 = 4 )
drop procedure PR_GET_PAGESIZE
go
create procedure PR_GET_PAGESIZE (
@SqlStr varchar(8000), -- SQL語(yǔ)句
@PageSize int, -- 每頁(yè)記錄數(shù)
@CurrentPage int -- 當(dāng)前頁(yè)數(shù)
)
as
begin
declare @FirstRec int, -- 頁(yè)起始行
@maxCount int, -- 頁(yè)結(jié)束行
@dt varchar(10) -- 生成臨時(shí)表的隨機(jī)數(shù)
select @FirstRec = (@CurrentPage - 1) * @PageSize -- 計(jì)算頁(yè)起始行
-- 將搜索結(jié)果放入臨時(shí)表中,表名隨機(jī)生成,在' from '前插入'into '+隨機(jī)臨時(shí)表名
select @SqlStr = stuff(@SqlStr, charindex(' from ',lower(@SqlStr)), 6,
', TEMPDB_ID = identity(11) into #temp_page from ')
-- 設(shè)置結(jié)束行
select @maxCount = @PageSize*@CurrentPage
select @SqlStr = 'set rowcount ' + convert(varchar, @maxCount)
+ ' ' + @SqlStr
+ ' set rowcount 0 '
-- 選取記錄號(hào)在起始行和結(jié)束行中間的記錄
select @SqlStr = @SqlStr + ' select * from #temp_page where TEMPDB_ID > ' + convert(varchar, @FirstRec)
print '%1!', @SqlStr
execute (@SqlStr)
end
go
sp_procxmode PR_GET_PAGESIZE, anymode
go
posted on 2008-10-14 16:36
歲月如歌 閱讀(2931)
評(píng)論(1) 編輯 收藏 所屬分類(lèi):
db