天天看點

[sql server] 分頁 - sql server 2000

SQL常用分頁的辦法~~

表中主鍵必須為辨別列,[ID] int IDENTITY (1,1)

1.分頁方案一:(利用Not In和SELECT TOP分頁)

語句形式:  

SELECT TOP 頁記錄數量 *

FROM 表名

WHERE (ID NOT IN

  (SELECT TOP (每頁行數*(頁數-1)) ID

  FROM 表名

  ORDER BY ID))

  ORDER BY ID

//自己還可以加上一些查詢條件

例:

select top 2 *

from Sys_Material_Type

where (MT_ID not in 

  (select top (2*(3-1)) MT_ID from Sys_Material_Type order by MT_ID))

order by MT_ID

2.分頁方案二:(利用ID大于多少和SELECT TOP分頁)

語句形式:

SELECT TOP 每頁記錄數量 *

FROM 表名

WHERE (ID >

  (SELECT MAX(id)

  FROM (SELECT TOP 每頁行數*頁數 id FROM 表

  ORDER BY id) AS T)

  )

ORDER BY ID

例:

SELECT TOP 2 *

FROM Sys_Material_Type

WHERE (MT_ID >

  (SELECT MAX(MT_ID)

  FROM (SELECT TOP (2*(3-1)) MT_ID

  FROM Sys_Material_Type

  ORDER BY MT_ID) AS T))

ORDER BY MT_ID

3.分頁方案三:(利用SQL的遊标存儲過程分頁)

create procedure SqlPager

@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, @[email protected] 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

4.總結:

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

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

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

分頁方案二:(利用ID大于多少和SELECT TOP分頁)效率最高,需要拼接SQL語句

分頁方案一:(利用Not In和SELECT TOP分頁) 效率次之,需要拼接SQL語句

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