一種.select top 10 * from tb where (id not in(select top 10*page from tb order by id)) order by id
其中,page是頁數的索引,實際的頁數要減一,這個分頁,對少數量的資料可以,也比使用游標快,但用到了not in關鍵字,就會對它的效率造成影響。
二種.select top 10 * from tb where (id>(select max(id) from (select top 10*page id from tb order by id) as tmp)) order by id
這種方法效率比上一種方法效率高
三種.@pagesize int,
@startid int
asselect * from (select row_number() over(order by id asc) as row,id,其它字段 from tb) as t where row>=@startid and row<@startid+@pagesize
這種方法是聽一位同學講的,這種方法只能在sql2005以上版本用,因為row_number()只在2005以上版本有,以下的沒有,這個的話,是一種分頁方法,我想的話效率應該不行吧,因為這個row_nmber()函式相當與給新的表 t 增加了乙個row欄位,所以每次都要全查一遍。
所以,按理來說,第二種不僅都可以用,而且效率也是最高的,所以我們就可以寫個通用的儲存過程:
create proc fengage
@tblname varchar(255), --表名
@strgetfields varchar(1000)='*', --需要返回的列
@fldname varchar(255)='', --排序的欄位名
@pagesize int=10, --頁尺寸(每面記錄數)
@pageindex int=1, --頁碼
@docount bit=0, --返回記錄總數,非0值則返回
@ordertype bit=0, --設定排序型別,非0值則降序
@strwhere varchar(1500)='' --查詢條件(注意:不要加where)
asdeclare @strsql varchar(5000) --主語句
declare @strtmp varchar(110) --臨時變數
declare @strorder varchar(400) --排序型別
if @docount!=0
begin
if @strwhere!=''
set @strsql='select count(*) as total from ['+@tblname+']where '+@strwhere
else
set @strsql='select count(*) as total from ['+@tblname+']'
endelse --以上**意思是如果@docount傳遞過來的不是0,就執行總數統計。以下的所有**都是@docount為0的情況
begin
if @ordertype!=0
begin
set @strtmp='<(select min'
set @strorder='order by ['+@fldname+'] desc'
--如果@ordertype不是0,就執行降序,這句很重要
end
else
begin
set @strtmp='>(select max'
set @strorder='order by ['+@fldname+'] asc'
endif @pageindex=1
begin
if @strwhere!=''
set @strsql='select top '+str(@pagesize)+' '+@strgetfields+' from ['+@tblname+'] where '+@strwhere +' '+@strorder
else
set @strsql='select top '+str(@pagesize)+' '+@strgetfields+' from ['+@tblname+'] '+@strorder
--如果是第一頁就執行上**,這樣會加快執行速度
endelse
begin
--以下**賦予了@strsql以真正執行的sql**
set @strsql='select top '+str(@pagesize)+' '+@strgetfields+' 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)+' '+@strgetfields+' from ['
+@tblname+'] where ['+@fldname+']'+@strtmp+'(['+@fldname+']) from (select top '
+str((@pageindex-1)*@pagesize)+' ['+@fldname+'] from '+@tblname+'] where '+@strwhere
+' '+@strorder+') as tbltmp) and '+@strwhere +' '+@strorder
endend
大量資料分頁儲存過程
create procedure pagination3 tables varchar 1000 表名稱,檢視 primarykey varchar 100 主關鍵字 sort varchar 200 bookid desc 排序語句,不帶order by 比如 newsid desc,orderr...
MySql大量資料的分頁查詢
1.直接用limit start,count分頁語句,也是我程式中用的方法 select from product limit start,count 當起始頁較小時,查詢沒有效能問題,我們分別看下從10,100,1000,10000開始分頁的執行時間 每頁取20條 如下 select from p...
SQLServer大量資料高效率分頁
以下為從大資料量表檢索分頁資料的有效方法 測試時,先從largetable表選出1000條記錄分頁呈現 time segment為資料表字段 declare pagesize int 每頁大小 declare currentpage int 當前頁 set pagesize 2 set curren...