星期五, 7月 05, 2019

[SQL] 分頁 - OFFSET、FECTCH

SQL Server 2012 開始提供的語法,主要應用在分頁(Paging)上

MS doc 語法說明
ORDER BY order_by_expression  
    [ COLLATE collation_name ]   
    [ ASC | DESC ]   
    [ ,...n ]   
[ <offset_fetch> ]  

<offset_fetch> ::=  
{   
    OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }  
    [  
      FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY  
    ]  
}
建立 uspPagingByOffset Store Procedure 來使用分頁功能
  • offset:跳過 N 筆資料
  • fetch next:跳過 N 筆資料後,抓指定筆數資料
CREATE PROCEDURE [dbo].[uspPagingByOffset] 
(
    @PageIndex int , 
    @PageRow int 
)
AS
    BEGIN

        SELECT SalesOrderID
        FROM [Sales].[SalesOrderHeader]
        ORDER BY SalesOrderID
        OFFSET ((@PageIndex - 1) * @PageRow) ROWS
        FETCH NEXT @PageRow ROWS ONLY
    END
GO
執行 Store Procedure 要取出 第 2 頁,每頁 10 筆資料的分頁資料
EXEC uspPagingByOffset 2 , 10
左結果為分頁結果、右結果為直接 Select 全部資料,搭配 SSMS 的資料編號來閱讀
[SQL] 分頁 - TOP
網路上範例看到 First 或 Next 交錯使用,測試結果是一樣,在 MS doc 上有發現這段說明
FIRST 和 NEXT 是同義字,基於 ANSI 相容性提供它們
ROW 和 ROWS 是同義字,基於 ANSI 相容性提供它們