SQL2012 分頁新語法 OFFSET 跟 FETCH
早期SQL2005到SQL2008R2版本中可以利用ROW_NUMBER()來達到分頁效果,
譬如說某Query語法Select出約1000筆資料,但我前端AP有分頁功能,因此我每
一頁的顯示是50筆資料。一般的程式設計師常常會忽略先在DB上取出需要的50筆
資料然後再將資料給AP,而常常是將1000筆資料給AP後再由AP上去處理分頁。因
此每一次換頁都有1000筆資料的IO,在效能上會是一大問題。
該如何在DB端取出已分頁的資料呢?在SQL2012以前使用ROW_NUMBER()處理,
下面語法依據salesorderid欄位來排序,並Select出排序在第51到100的資料出來。
Select * From(
SELECT ROW_NUMBER() Over(Order By salesorderid Desc) num,*
FROM [AdventureWorks2012].[Sales].[SalesOrderDetail]) a
Where num Between 51 And 100
然而在SQL2012出現了專為分頁而設計的語法,擴充了Order By的子句 OFFSET ROWS
跟FETCH NEXT ROWS文件說明。下面語法依據salesorderid欄位來排序,從第51號
(跳過50筆)然後往下抓50筆資料。
Select * From [AdventureWorks2012].[Sales].[SalesOrderDetail]
Order By SalesOrderID Desc
Offset 50 Rows
Fetch Next 50 Rows Only
如下圖可看出新語法使用資源較少
我是ROCK
rockchang@mails.fju.edu.tw