用存儲過程,建立臨時表,獲取數(shù)據(jù),然后動態(tài)sql獲得臨時表數(shù)據(jù)。最后從網(wǎng)上找到的如下的兩個分頁存儲過程:
-- 按行讀取
CREATE PROCEDURE GetDataByLine
(
--創(chuàng)建一個分頁讀取過程
@SqlStr varchar(8000), --SQL語句
@FirstRec int, --頁起始行
@LastRec int --頁結(jié)束行
)
AS
DECLARE @dt varchar(10) --生成臨時表的隨機數(shù)
BEGIN
SELECT @dt= substring(convert(varchar, rand()), 3, 10) --一個字符型的隨機數(shù)
--將搜索結(jié)果放入臨時表中,表名隨機生成,在' FROM '前插入'INTO '+隨機臨時表名
SELECT @SqlStr = stuff(@SqlStr, charindex(' FROM ', upper(@SqlStr)), 6 ,' INTO tempdb..Lining' + @dt + ' FROM ')
EXECUTE (@SqlStr)
--為臨時表增加id號
SELECT @SqlStr = 'ALTER TABLE tempdb..Lining' + @dt + ' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
EXECUTE (@SqlStr)
--計算臨時表中的記錄數(shù)
--SELECT @SqlStr = 'SELECT Count(*) From tempdb..Lining' + @dt
--EXECUTE (@SqlStr)
--選取記錄號在起始行和結(jié)束行中間的記錄
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
*/
-- 按頁讀取
CREATE PROCEDURE GetDataByPage
(
--創(chuàng)建一個分頁讀取過程
@SqlStr varchar(8000), --SQL語句
@PageSize int, --每頁記錄數(shù)
@CurrentPage int --當(dāng)前頁數(shù)
)
AS
DECLARE @FirstRec int, @LastRec int, @dt varchar(10) --頁起始行,頁結(jié)束行,生成臨時表的隨機數(shù)
BEGIN
SELECT @FirstRec = (@CurrentPage - 1) * @PageSize --計算頁起始行
SELECT @LastRec = (@CurrentPage * @PageSize + 1) --計算頁結(jié)束行
SELECT @dt= substring(convert(varchar,rand()),3,10) --一個字符型的隨機數(shù)
--將搜索結(jié)果放入臨時表中,表名隨機生成,在' FROM '前插入'INTO '+隨機臨時表名
SELECT @SqlStr = stuff(@SqlStr, charindex(' FROM ',upper(@SqlStr)), 6 ,' INTO tempdb..Paging'+@dt+' FROM ')
EXECUTE (@SqlStr)
--為臨時表增加id號
SELECT @SqlStr = 'ALTER TABLE tempdb..Paging'+@dt+' ADD TEMPDB_ID numeric(10) IDENTITY PRIMARY KEY'
EXECUTE (@SqlStr)
--計算臨時表中的記錄數(shù)
--SELECT @SqlStr = 'SELECT Count(*) From tempdb..Paging'+@dt
--EXECUTE (@SqlStr)
--選取記錄號在起始行和結(jié)束行中間的記錄
SELECT @SqlStr = 'SELECT * FROM tempdb..Paging'+@dt+' WHERE TEMPDB_ID > '+convert(varchar,@FirstRec)+' and TEMPDB_ID < '+convert(varchar,@LastRec)
EXECUTE (@SqlStr)
--刪除臨時表
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
*/