代碼段——SQL Server 分頁語句

SQL Server 分頁語句

0. 使用Top

  • 適應於Sql Server2005以前版本
  • 相對性能有損失
  • 原理:按照指定的字段排序取前前面所有頁的數據,再總表中按相同字段排序取排除前面所有頁的數據,取頁面數的記錄
DECLARE @pageSize INT = 100;
DECLARE @pageIndex INT = 2;

SELECT TOP(SELECT @pageSize) *
FROM 目標表
WHERE CreateTime NOT IN
(SELECT TOP(SELECT @pageSize * (@pageIndex - 1)) CreateTime FROM 目標表 ORDER BY CreateTime)
ORDER BY CreateTime;

1. 使用Row_Number()函數+Top()函數

  • Row_Nubmer()函數是SQL Server2005版本及以上纔有
DECLARE @pageSize INT = 100;--頁面記錄數量
DECLARE @pageIndex INT = 2;--頁數

SELECT TOP(SELECT @pageSize) * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY CreateTime DESC	) AS RowNum,* FROM 查詢表) temp
WHERE RowNum > ((@pageIndex - 1) * @pageSize);

SELECT COUNT(1) AS TotalCount FROM 目標表--返回查詢結果的總行數

2. 僅使用Row_Number()函數

DECLARE @pageSize INT = 100;
DECLARE @pageIndex INT = 2;

SELECT  * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY CreateTime DESC	) AS RowNum,* FROM 查詢表) temp
WHERE RowNum BETWEEN (@pageIndex-1)* @pageSize+1 AND  @pageIndex * @pageSize--計算取值範圍並篩選取值

SELECT COUNT(1) AS TotalCount FROM 目標表--返回查詢結果的總行數

3. 使用 offset /fetch next

  • offset 、fetch next 需要 SQL Server 2012版本及以上纔有
  • 語法:
ORDER BY column_list [ASC |DESC]
[OFFSET offset_row_count {ROW | ROWS}
[FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} ONLY]]

這裏FIRST與NEXT是同義的,可以互換使用。ROW 和 ROWS 也是同義的,可以互用。 注意使用ROWS則查詢結果當前排序的逆序排列
offset_row_count:可以是大於或等於0的常量(constant)、變量(variable)或參數(parameter); 
fetch_row_count: 可以是大於或等於1的常量(constant)、變量(variable)或標量(scalar)。
注意:

offset和 fetch 僅可以在order by子句後面才能使用,不能與top一起使用,(用“offset 0 fetch next N ROWS ONLY”可以替代“top N”的功能);
fetch是可選項,用於限制返回行數,只能跟在offset後面使用。
--分頁
--簡而言之:offset指跳過多少行,fetch next指取多少行
--用OFFSET 和 FETCH 子句實現分頁功能比用ROW_NUMBER()函數做子查詢的方式會少耗一些資源,性能更好。
-- 分頁查詢(通用型)
DECLARE @pageIndex INT = 2;
DECLARE @pageSize INT = 100;
SELECT *
FROM dbo.DeviceList
ORDER BY CreateTime OFFSET ((@pageIndex - 1) * @pageSize) ROW FETCH NEXT @pageSize ROW ONLY;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章