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