SQLSERVER2012的分頁新功能

 

 


SQLSERVER2012的分頁新功能
 
   

  

 簡介

   SQL Server 2012中在Order By子句以後新增了OFFSET和FETCH子句來限制輸出的行數從而達到了分頁效果。相比較SQL Server 2005/2008的ROW_Number函數而言,使用OFFSET和FETCH不單單是從語法角度更加簡單,而且擁有了更優的性能。


限制返回的行數


如下示例使用 OFFSET 和 FETCH 限制查詢返回的行數。

A.指定整數常量以提供 OFFSET 和 FETCH 值


如下示例將一個整數常量指定爲 OFFSET 和 FETCH 子句的值。

第一個查詢返回全部按 DepartmentID 列排序的行。

將此查詢返回的結果與後面的兩個查詢的結果進行比較。

下一個查詢使用 OFFSET 5 ROWS 子句跳過前 5 行,而後返回全部其他行。

最終查詢使用 OFFSET 0 ROWS 子句從第一行開始,而後使用 FETCH NEXT 10 ROWS ONLY 將返回的行限制爲排序的結果集中的 10 行。




  USE AdventureWorks2012;



  GO

  -- Return all rows sorted by the column DepartmentID.
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
  ORDER BY DepartmentID;
  
  -- Skip the first 5 rows from the sorted result set and return all remaining rows.
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
  ORDER BY DepartmentID OFFSET 5 ROWS;
  
  -- Skip 0 rows and return only the first 10 rows from the sorted result set.
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
  ORDER BY DepartmentID 
      OFFSET 0 ROWS
      FETCH NEXT 10 ROWS ONLY;   






B.指定變量以提供 OFFSET 和 FETCH 值

如下示例聲明 @StartingRowNumber@FetchRows 變量,並在 OFFSET 和 FETCH 子句中指定這些變量。


USE AdventureWorks2012;





  GO
  -- Specifying variables for OFFSET and FETCH values  
  DECLARE @StartingRowNumber tinyint = 1
        , @FetchRows tinyint = 8;
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
  ORDER BY DepartmentID ASC 
      OFFSET @StartingRowNumber ROWS 
      FETCH NEXT @FetchRows ROWS ONLY;
 C.指定表達式以提供 OFFSET 和 FETCH 值


如下示例使用 @StartingRowNumber - 1 表達式指定 OFFSET 值,並使用 @EndingRowNumber - @StartingRowNumber + 1 表達式指定 FETCH 值。

另外,還指定了查詢提示 OPTIMIZE FOR。

在編譯和優化查詢時,能夠使用此提示爲局部變量提供特定的值。

僅在查詢優化期間使用該值,在查詢執行期間不使用該值。

USE AdventureWorks2012;




  GO
  
  -- Specifying expressions for OFFSET and FETCH values    
  DECLARE @StartingRowNumber tinyint = 1
        , @EndingRowNumber tinyint = 8;
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
  ORDER BY DepartmentID ASC 
      OFFSET @StartingRowNumber - 1 ROWS 
      FETCH NEXT @EndingRowNumber - @StartingRowNumber + 1 ROWS ONLY
  OPTION ( OPTIMIZE FOR (@StartingRowNumber = 1, @EndingRowNumber = 20) );
D.指定常數標量子查詢以提供 OFFSET 和 FETCH 值


如下示例使用常數標量子查詢定義 FETCH 子句的值。

該子查詢從 dbo.AppSettings 表的 PageSize 列中返回單個值。

-- Specifying a constant scalar subquery




  USE AdventureWorks2012;
  GO
  CREATE TABLE dbo.AppSettings (AppSettingID int NOT NULL, PageSize int NOT NULL);
  GO
  INSERT INTO dbo.AppSettings VALUES(1, 10);
  GO
  DECLARE @StartingRowNumber tinyint = 1;
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
  ORDER BY DepartmentID ASC 
      OFFSET @StartingRowNumber ROWS 
      FETCH NEXT (SELECT PageSize FROM dbo.AppSettings WHERE AppSettingID = 1) ROWS ONLY;
  
詳細的官方資料請參閱 http://msdn.microsoft.com/en-us/library/ms188385%28v=SQL.110%29.aspx

  
  


相關文章
相關標籤/搜索