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;