SQL server分頁的四種方法(算很全面了)

2021-10-10 21:34:09 字數 3318 閱讀 2753

這篇部落格講的是sql server的分頁方法,用的sql server 2012版本。下面都用pageindex表示頁數,pagesize表示一頁包含的記錄。並且下面涉及到具體例子的,設定查詢第2頁,每頁含10條記錄。

首先說一下sql server的分頁與mysql的分頁的不同,mysql的分頁直接是用limit (pageindex-1),pagesize就可以完成,但是sql server 並沒有limit關鍵字,只有類似limit的top關鍵字。所以分頁起來比較麻煩。

sql server分頁我所知道的就只有四種:三重迴圈;利用max(主鍵);利用row_number關鍵字,offset/fetch next關鍵字(是通過蒐集網上的其他人的方法總結的,應該目前只有這四種方法的思路,其他方法都是基於此變形的)。

先取前20頁,然後倒序,取倒序後前10條記錄,這樣就能得到分頁所需要的資料,不過順序反了,之後可以將再倒序回來,也可以不再排序了,直接交給前端排序。

還有一種方法也算是屬於這種型別的,這裡就不放**出來了,只講一下思路,就是先查詢出前10條記錄,然後用not in排除了這10條,再查詢。

**實現

– 設定執行時間開始,用來檢視效能的

set statistics time on ;

– 分頁查詢(通用型)

select *

from (select top pagesize *

from (select top (pageindex*pagesize) *

from student

order by sno asc ) – 其中裡面這層,必須指定按照公升序排序,省略的話,查詢出的結果是錯誤的。

as temp_sum_student

order by sno desc ) temp_order

order by sno asc

– 分頁查詢第2頁,每頁有10條記錄

select *

from (select top 10 *

from (select top 20 *

from student

order by sno asc ) – 其中裡面這層,必須指定按照公升序排序,省略的話,查詢出的結果是錯誤的。

as temp_sum_student

order by sno desc ) temp_order

order by sno asc

;查詢出的結果及時間

先top前11條行記錄,然後利用max(id)得到最大的id,之後再重新再這個表查詢前10條,不過要加上條件,where id>max(id)。

**實現

set statistics time on;

– 分頁查詢(通用型)

select top pagesize *

from student

where sno>=

(select max(sno)

from (select top ((pageindex-1)*pagesize+1) sno

from student

order by sno asc) temp_max_ids)

order by sno;

– 分頁查詢第2頁,每頁有10條記錄

select top 10 *

from student

where sno>=

(select max(sno)

from (select top 11 sno

from student

order by sno asc) temp_max_ids)

order by sno;

查詢出的結果及時間

直接利用row_number() over(order by id)函式計算出行數,選定相應行數返回即可,不過該關鍵字只有在sql server 2005版本以上才有。

sql實現

set statistics time on;

– 分頁查詢(通用型)

select top pagesize *

from (select row_number()

over(order by sno asc) as rownumber,*

from student) temp_row

where rownumber>((pageindex-1)*pagesize);

set statistics time on;

– 分頁查詢第2頁,每頁有10條記錄

select top 10 *

from (select row_number()

over(order by sno asc) as rownumber,*

from student) temp_row

where rownumber>10;

查詢出的結果及時間

set statistics time on;

– 分頁查詢(通用型)

select * from student

order by sno

offset ((@pageindex-1)*@pagesize) rows

fetch next @pagesize rows only;

– 分頁查詢第2頁,每頁有10條記錄

select * from student

order by sno

offset 10 rows

fetch next 10 rows only ;

offset a rows ,將前a條記錄捨去,fetch next b rows only ,向後在讀取b條資料。

結果及執行時間

這裡寫描述

這裡寫描述

封裝的儲存過程

最後,我封裝了乙個分頁的儲存過程,方便大家呼叫,這樣到時候寫分頁的時候,直接呼叫這個儲存過程就可以了。

分頁的儲存過程

create procedure paging_procedure

( @pageindex int, – 第幾頁

@pagesize int – 每頁包含的記錄數)as

begin

select top (select @pagesize) * – 這裡注意一下,不能直接把變數放在這裡,要用select

from (select row_number() over(order by sno) as rownumber,*

from student) temp_row

where rownumber>(@pageindex-1)*@pagesize;

end– 到時候直接呼叫就可以了,執行如下的語句進行呼叫分頁的儲存過程

exec paging_procedure @pageindex=2,@pagesize=10;

SQL server分頁的四種方法

首先說一下sql server的分頁與mysql的分頁的不同,mysql的分頁直接是用limit pageindex 1 pagesize就可以完成,但是sql server 並沒有limit關鍵字,只有類似limit的top關鍵字。所以分頁起來比較麻煩。sql server分頁我所知道的就只有四種...

四種方式實現SQLServer 分頁查詢

sqlserver 的資料分頁 假設現在有這樣的一張表 create table test id int primary key not null identity,names varchar 20 然後向裡面插入大約1000條資料,進行分頁測試 假設頁數是10,現在要拿出第5頁的內容,查詢語句如下...

四種方式實現SQLServer 分頁查詢

sqlserver 的資料分頁 自己使用時的心得 select top 10 這個10 位一頁顯示的個數 from nrc news where n id notin 40 是這麼計算出來的 10 5 1 每頁10 條,查第5頁 select top40 n id from nrc news ord...