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, @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
 
4.總結:
其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
建議優化的時候,加上主鍵和索引,查詢效率會提高。

通過SQL 查詢分析器,顯示比較:我的結論是:
分頁方案二:(利用ID大於多少和SELECT TOP分頁)效率最高,需要拼接SQL語句
分頁方案一:(利用Not In和SELECT TOP分頁)  效率次之,需要拼接SQL語句
分頁方案三:(利用SQL的遊標存儲過程分頁)    效率最差,但是最爲通用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章