在SQL Server中通過SQL語句實現分頁查詢

2021-06-19 05:12:37 字數 2570 閱讀 5749

建立表: 

create table [testtable] ( 

[id] [int] identity (1, 1) not null , 

[firstname] [nvarchar] (100) collate chinese_prc_ci_as null , 

[lastname] [nvarchar] (100) collate chinese_prc_ci_as null , 

[country] [nvarchar] (50) collate chinese_prc_ci_as null , 

[note] [nvarchar] (2000) collate chinese_prc_ci_as null 

) on [primary] 

go 插入資料:(2萬條,用更多的資料測試會明顯一些) 

set identity_insert testtable on 

declare @i int 

set @i=1 

while @i<=20000 

begin 

insert into testtable([id], firstname, lastname, country,note) values(@i, 'firstname_***','lastname_***','country_***','note_***') 

set @i=@i+1 

end 

set identity_insert testtable off 

------------------------------------- 

分頁方案一:(利用not in和select top分頁) 

語句形式: 

select top 10 * 

from testtable 

where (id not in 

(select top 20 id 

from testtable 

order by id)) 

order by id 

select top 頁大小 * 

from testtable 

where (id not in 

(select top 頁大小*頁數 id 

from 表 

order by id)) 

order by id 

------------------------------------- 

分頁方案二:(利用id大於多少和select top分頁) 

語句形式: 

select top 10 * 

from testtable 

where (id > 

(select max(id) 

from (select top 20 id 

from testtable 

order by id) as t)) 

order by id 

select top 頁大小 * 

from testtable 

where (id > 

(select max(id) 

from (select top 頁大小*頁數 id 

from 表 

order by id) as t)) 

order by id 

------------------------------------- 

分頁方案三:(利用sql的游標儲存過程分頁) 

create procedure xiaozhengge 

@sqlstr nvarchar(4000), --查詢字串 

@currentpage int, --第n頁 

@pagesize int --每頁行數 

as set nocount on 

declare @p1 int, --p1是游標的id 

@rowcount int 

exec sp_cursoropen @p1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output 

select ceiling(1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁 

set @currentpage=(@currentpage-1)*@pagesize+1 

exec sp_cursorfetch @p1,16,@currentpage,@pagesize 

exec sp_cursorclose @p1 

set nocount off 

其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。 

建議優化的時候,加上主鍵和索引,查詢效率會提高。 

通過sql 查詢分析器,顯示比較:我的結論是: 

分頁方案二:(利用id大於多少和select top分頁)效率最高,需要拼接sql語句 

分頁方案一:(利用not in和select top分頁) 效率次之,需要拼接sql語句 

分頁方案三:(利用sql的游標儲存過程分頁) 效率最差,但是最為通用 

在sqlserver中with nolock 詳解

在查詢語句中使用 nolock 和 readpast 處理乙個資料庫死鎖的異常時候,其中乙個建議就是使用 nolock 或者 readpast 有關 nolock 和 readpast的一些技術知識點 對於非銀行等嚴格要求事務的行業,搜尋記錄中出現或者不出現某條記錄,都是在可容忍範圍內,所以碰到死鎖...

SQL Server迴圈查詢資料或執行SQL

直接上sql,此實力 適用於修改資料 宣告變數 declare i int declare max int declare groupid int declare userid int set i 1 select max max id from tpersonneltable while i ma...

sql server 2008匯入和匯出sql檔案

匯出表資料和表結構sql檔案 在日常的開發過程中,經常需要匯出某個資料庫中,某些表資料 或者,需要對某個表的結構,資料進行修改的時候,就需要在資料庫中匯出表的sql結構,包括該錶的建表語句和資料儲存語句!在這個時候,就可以利用本方法來操作!步驟閱讀 1開啟sqlserver2008,連線成功後,選擇...