SQL - SQL SERVER 2012 Paging(分頁)

摘要:SQL - SQL SERVER 2012 Paging(分頁)

在 SQL SERVER 2012 以前,要使用 Stored Procedure 來做到分頁其實不是件難事,縱使對於此方法不熟的,也可以換用 Visual C# & VB 來做到分頁的效果。

不過現在,SQL SERVER 2012 進化了,提供了分頁的語法,筆者在做相關測試的時候,發覺上手度極高,只要看得懂MSDN的範例,其實自己要寫出一個專屬於分頁用的 Stored Procedure,其實是一件很簡單的事...

範例一:取得第10筆以後的資料

語法:
SELECT *
FROM dbo.Orders o
ORDER BY o.OrderID ASC
OFFSET 10 ROWS

結果:


範例二:從第1筆資料開始,取10筆資料

語法:
SELECT *
FROM dbo.Orders o
ORDER BY o.OrderID ASC
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY

結果:


範例三:使用變數,從第11筆資料開始,取20筆資料

語法:
DECLARE @p_OFFSET tinyint = 10
DECLARE @p_FETCH tinyint = 20

SELECT *
FROM dbo.Orders o
ORDER BY o.OrderID ASC
OFFSET @p_OFFSET ROWS
FETCH NEXT @p_FETCH ROWS ONLY

結果:


範例四:子查詢用法

語法:
DECLARE @MYTABLE TABLE (
C_UID INT,
C_FETCH INT
);

INSERT INTO @MYTABLE VALUES(1, 20);

SELECT *
FROM DBO.ORDERS O
ORDER BY O.ORDERID ASC
OFFSET 0 ROWS
FETCH NEXT (SELECT C_FETCH FROM @MYTABLE WHERE C_UID = 1) ROWS ONLY;

結果:


範例五:在 SQL SERVER 2012 以前的用法,取得11到20的資料

語法:

SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY O.ORDERID) AS SEQ_NUM, *
FROM DBO.ORDERS O) AS A
WHERE SEQ_NUM > 10 AND SEQ_NUM <= 20
--WHERE SEQ_NUM BETWEEN 11 AND 20

結果:


參考:
ORDER BY 子句 (Transact-SQL)
SQL Server 2012 :分頁處理:認識 OFFSET 和 FETCH 子句
Offset and Fetch First/Next Clause – Extension to Order by clause in Sql 11(Code
Name: Denali (SQL Server 2012))