create procedure [dbo].[getrecordfrompage]
@tblname varchar(255), -- 表名
@fldname varchar(2552), -- 欄位名
@pagesize int = 10, -- 頁尺寸
@pageindex int = 1, -- 頁碼
@iscount bit = 0, -- 返回記錄總數, 非 0 值則返回
@ordertype bit = 0, -- 設定排序型別, 非 0 值則降序
@strwhere varchar(1000) = '' -- 查詢條件 (注意: 不要加 where)
asdeclare @strsql varchar(6000) -- 主語句
declare @strtmp varchar(1000) -- 臨時變數
declare @strorder varchar(4000) -- 排序型別
if @ordertype != 0
begin
set @strtmp = '<(select min'
set @strorder = ' order by [' + @fldname +'] desc'
endelse
begin
set @strtmp = '>(select max'
set @strorder = ' order by [' + @fldname +'] asc'
endset @strsql = 'select top ' + str(@pagesize) + ' * from ['
+ @tblname + '] where [' + @fldname + ']' + @strtmp + '(['
+ @fldname + ']) from (select top ' + str((@pageindex-1)*@pagesize) + ' ['
+ @fldname + '] from [' + @tblname + ']' + @strorder + ') as tbltmp)'
+ @strorder
if @strwhere != ''
set @strsql = 'select top ' + str(@pagesize) + ' * from ['
+ @tblname + '] where [' + @fldname + ']' + @strtmp + '(['
+ @fldname + ']) from (select top ' + str((@pageindex-1)*@pagesize) + ' ['
+ @fldname + '] from [' + @tblname + '] where ' + @strwhere + ' '
+ @strorder + ') as tbltmp) and ' + @strwhere + ' ' + @strorder
if @pageindex = 1
begin
set @strtmp = ''
if @strwhere != ''
set @strtmp = ' where ' + @strwhere
set @strsql = 'select top ' + str(@pagesize) + ' * from ['
+ @tblname + ']' + @strtmp + ' ' + @strorder
endif @iscount != 0
set @strsql = 'select count(*) as total from [' + @tblname + ']'
exec (@strsql)
執行此儲存過程:
declare @return_value int
exec @return_value = [dbo].[getrecordfrompage]
@tblname = n'breakfastprice_1_bak',
@fldname = n'id',
@pagesize = 100,
@pageindex = 4201,
@iscount = 0,
@ordertype = 1
select 'return value' = @return_value
go結果只要3秒就ok了
(測試是在擁有50多萬資料表中進行)
而用下面的儲存過程
create proc [dbo].[gethotelinfoonweb]
@pagesize int,
@pageindex int
declare @startnum varchar(20)--分頁開始數值
declare @endnum varchar(20)--分頁結束數值
declare @str varchar(4000)
set @startnum=convert(varchar(20),(@pageindex-1)*@pagesize)
set @endnum=convert(varchar(20),@pageindex*@pagesize)
select @str='select c.* from (select row_number() over(order by id desc) as rowid,* from breakfastprice_1_bak ) as c'
select @str='select a.* from ('++') as a where a.rowid<'+@startnum+' and a.rowid>='+ @endnum
exec(@str)
執行完結果需要13秒
實現千萬級資料的分頁顯示
名稱 spall deletenoneunique 輸入 要查詢的表名和字段列表 輸出 呼叫 說明 實現千萬級資料的分頁顯示 可以在5秒內獲取 1448萬條記錄裡的第1200頁的100條記錄,雄不?create procedure getrecordfrompage tblname varchar ...
實現千萬級資料的分頁顯示
實現千萬級資料的分頁顯示 經測試,在 14483461 條記錄中查詢第 100000 頁,每頁 10 條記錄按公升序和降序第一次時間均為 0.47 秒,第二次時間均為 0.43 秒,測試語法如下 exec getrecordfrompage news,newsid,10,100000 news 為 ...
實現千萬級資料的分頁顯示
名稱 spall deletenoneunique 輸入 要查詢的表名和字段列表 輸出 呼叫 說明 實現千萬級資料的分頁顯示 可以在5秒內獲取 1448萬條記錄裡的第1200頁的100條記錄,雄不?create procedure getrecordfrompage tblname?varchar ...