SQL2005分頁查詢

2021-09-06 03:05:40 字數 3248 閱讀 6584

1 通過select top進行分頁查詢

/*查詢原理:需要查詢第n頁時,首先取到前n頁的所有資料,然後排除前n-1頁的資料,就是第n頁的資料*/

create procedure getdatawithpage

( @pageindex int = 1, -- 頁碼

@pagesize int = 20, -- 頁尺寸 )as

begin

if @pageindex < 1

begin

set @pageindex=1

end

--如果是第一頁時要執行的語句

if @pageindex = 1

begin

select top ((@pageindex)*@pagesize)

field1,field2,--查詢字段

fieldorderby --排序字段,按什麼字段分頁的字段,建議使用主鍵,或者唯一鍵

from tablename --查詢表名稱

where id>100 --查詢條件

order by fieldorderby --排序字段,按什麼字段分頁的字段,

select count(*) as total from tablename where id>100--返回總記錄數

endelse

begin

select top ((@pageindex)*@pagesize) --取出前pageindex頁的資料

field1,field2,--查詢字段

fieldorderby --排序字段,按什麼字段分頁的字段,建議使用主鍵,或者唯一鍵

into #temptable --插入臨時表

from tablename --查詢表名稱

where id>100 --查詢條件

order by fieldorderby --排序字段,按什麼字段分頁的字段,

-----取出前pageindex頁資料插入臨時表

------排除前pageindex-1頁的資料,取出第pageindex的資料

select top (@pageindex) --

field1,field2,--排序字段

fieldorderby --

from #temptable --從臨時表中取資料

where fieldorderby --

not in (select top ((@pageindex-1)*@pagesize) fieldorderby from #temptable)

---- 從臨時表取出 pageindex的資料

----可以根據公升序或者降序把not in 改為 100--返回總記錄數

endend

2通過系統儲存過程進行分頁查詢

/*

一共返回三個表第乙個表為空 查詢字串的條件中有 like ,in 可能出現問題,具體出現原因不明,第二個表包含總頁數,總行數,

當前頁第三個表包含查詢記錄

*/create procedure [dbo].[getonepagedata]

@sqlstr nvarchar(4000), --查詢字串 ,就是一般的查詢語句,不需要top關鍵字

@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

--定義與游標和游標選項相關聯的 sql 語句,然後填充游標。

--選擇總頁數,總行數,當前頁

select ceiling(1.0*@rowcount/@pagesize) as totalpages,@rowcount as totalrows,@currentpage as curpage

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

--查詢記錄

exec sp_cursorfetch @p1,16,@currentpage,@pagesize --從游標中提取一行或乙個行塊。

--返回值

exec sp_cursorclose @p1--關閉並釋放游標

set nocount off

go

3 通過新函式row_number()進行分頁查詢

/*

適用於sql2005,據調查此方法限制最少,效能最佳

返回兩個表,第乙個表包含總行數,第二個表是查詢到的記錄

--分頁查詢的原理:

--1.先將預分頁內容按照排序條件加上自增列匯入到臨時表中(或表變數)

--2.針對臨時表操作,找到相應的n頁對應的自增列編碼範圍

--3.根據第n頁對應的自增列編碼範圍,查詢第n頁內容

--需要注意的是:

--第一是新增自增列,確定行號

--第二縮減中間處理過程的運算元據量

*/create proc [dbo].[getonepagedata]--//

( @page int,

@pagesize int)as

begin

select top (@pagesize*@page) row_number() --可以減少處理的資料,加快速度

over(order by nodeid) as rownum,--按什麼字段分頁的字段,不需要唯一性

nodeid,nodename,controlip --查詢字段

into #temp --插入臨時表

from tablename -- 查詢表名稱

where nodeid>100 --查詢條件

select count(*) from #temp--總記錄條數

select * from #temp where rownum>@pagesize*(@page-1) and rownum<=@pagesize*@page--

end

綜述,如果需要通用的儲存過程,可以把第一或者第三種分頁方法進行改寫,在資料庫拼字串,但效能會差好多。這或許就是通用和效能之間的矛盾吧。

SQL2005 分頁儲存過程

最近在使用sqlserver2005的資料庫編碼,查到有乙個row number order by 字段 的函式,通過該函式進行分頁非常的方便,請大家看看我寫的分頁儲存過程。分頁儲存過程 create procedure dbo proc testpage 表名 tablename nvarchar...

sql 2005分頁儲存過程

tblname varchar 255 表名 fldname varchar 255 欄位名 ordertype bit 0,設定排序型別,非 0 值則降序 iscount bit 0,設定排序型別,非 0 值則降序 strwhere varchar 3000 查詢條件 注意 不要加 where s...

SQL2005分頁儲存過程

author sql2005分頁儲存過程htl258 tony date 2009 09 22 13 00 50 version microsoft sql server 2008 sp1 10.0.2531.0 intel x86 mar 29 2009 10 27 29 enterprise e...