SQL2012 分頁新語法 OFFSET 跟 FETCH

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

如下圖可看出新語法使用資源較少

物件-2

我是ROCK

rockchang@mails.fju.edu.tw