我們要把大量的資料分頁顯示,以前在asp裡或其它程式裡的做法是把資料全部取出來,然後根據不同的頁碼用程式去計算應該顯示哪部分,如果資料量過大的話,可以想像每次都要調出來很多沒用的資料,是不是會很慢呢,而分頁儲存過程解決了這一問題,每次只調出有用的資料,其餘部分的資料並不會傳輸到程式裡,這樣就給資料的傳輸大大增加了效率。
假如我們有一百條資料,現在要分二十頁顯示,一頁顯示五條。
第一頁:1至5條,第二頁:6至10條,第三頁:10至15條。
分頁儲存過程思路分析:
可以看到上面這種方法,隨著資料量的增大 not in計算的資料也要增大,而且有的時候有條件的話還需要一次性把所有的資料取出來,然後再排序取前面幾條,然後再not in,而下面介紹這種方式完全不需要把全部資料取出來。
高效分頁儲存過程思路分析:
如何不通過not in方法取出自己想要的資料呢,很簡單,我們只需要用top就可以了,說一下簡單的思路,比如取第6條到第十條資料的時候我們可以先取前十條資料,按時間排序(top 10),然後我們再從這十條資料裡按時間倒序排序取前五條資料,這樣取出來的資料就是從10到6條了,然後我們再正序排一下序就是從6到10條了,怎麼樣,簡單吧,下面我們來寫一下這條sql語句。
高效分頁儲存過程sql語句講解:
我們還是舉上面的例子,取從第6到第10條資料:
第一步,我們要取從第一到第十條資料:select top 10 * from table order by id
第二步,我們在這十條資料裡反取五條:
select top 5 * from table where id in (select top 10 id from table order by id ) order by id desc
ok,執行下以上這條句話,我們已經得到第6到第10條了,只不過順序是反的,那麼我們再排一下序給正過來就可以了。
第三步,正序排序資料:
select top 5 * from table where id in
(select top 5 id from table where id in (select top 10 id from table order by id ) order by id desc)
order by id
好了,到這裡,我們的第六條到第十條,也就是第二頁的內容就算是取出來了。
下面我們要想辦法把這個**構造成乙個儲存過程,通用於任何表,任何條件,任何條數的資料,這樣的話,我們就有幾個地方需要改成變數了,首先每頁的條數需要改成變數,還有就是表名和條件都要改成變數,最後我們還要把排序欄位也要改成變數。
構造儲存過程詳細**:
建立儲存過程之前先定義變數
create procedure splitpage(
@collist varchar(4000)='', --顯示字段
@table varchar(4000)='',--查詢的表,from後面的語句
@where varchar(4000)='',--查詢條件,where後面的語句
@sort varchar(255)='',--排序條件,不帶表名的欄位名且不帶asc,desc,
@ascdesc varchar(255)='',--排序asc,desc,
@pagesize int=0,--每頁記錄數
@pageindex int=0,--當前頁碼
@id varchar(255)='',--id欄位,例如"memberid"
)--每個變數後面都加了詳細的注釋,這個不用我解釋了吧,如果你還不明白的話,看看後面我們怎麼用就行了。
declare @sql nvarchar(4000)
if(@where='')
begin
set @where='1=1'
end--如果條件為空的話則給乙個1=1永遠為真的條件,你也可以在下面的語句中把where刪除掉,從頁面上傳進來
set @sql='select top '+cast(@pagesize as varchar(20))+' '+@collist+' from '+@table+' where '+@id+' in
(select top '+cast(@pagesize as varchar(20))+' '+@id+' from '+@table+' where '+@id+' in
(select top '+cast((@pagesize*@pageindex) as varchar(20))+' '+@id+' from '+@table+' where '+@where+' order by '+@sort+' '+@ascdesc+')
order by '+@id+' asc
) order by '+@id+' '+@ascdesc
exec(@sql)--執行sql語句
總結:
ok,到這裡我們就算是把這個高效的分頁儲存過程講解完了,但是還有乙個小小的不足之處,排序是自已寫好的,沒有從頁面上傳進來,你可以再定義乙個變數儲存包含desc或asc的變數然後完成按要求排序。
高效分頁儲存過程
高效分頁儲存過程 儲存過程與頁面呼叫如下 create procedure search sp tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸...
高效分頁儲存過程
儲存過程與頁面呼叫如下 create procedure search sp tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageinde...
高效分頁儲存過程
儲存過程與頁面呼叫如下 create procedure search sp tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageinde...