在 MSSQL(Microsoft SQL Server)中,可以通过以下几种方式实现分页查询,具体方式取决于使用的 SQL Server 版本。
1. 适用于 SQL Server 2012 及以上版本:使用 OFFSET
和 FETCH
子句
这是推荐的方式,语法简洁且性能较好。
SELECT *
FROM YourTable
ORDER BY ColumnName
OFFSET (@PageNumber - 1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;
@PageNumber
: 页码(从 1 开始)。@PageSize
: 每页显示的行数。ColumnName
: 必须指定排序字段。
示例:
假设 YourTable
中有 1000 条记录,每页 10 条,查询第 3 页数据:
DECLARE @PageNumber INT = 3;
DECLARE @PageSize INT = 10;
SELECT *
FROM YourTable
ORDER BY Id -- 必须指定排序列
OFFSET (@PageNumber - 1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;
2. 适用于 SQL Server 2005 和 2008:使用子查询或 ROW_NUMBER()
这些版本没有 OFFSET
和 FETCH
,可以通过 ROW_NUMBER()
和子查询实现分页。
WITH CTE AS (
SELECT
*,
ROW_NUMBER() OVER (ORDER BY ColumnName) AS RowNum
FROM YourTable
)
SELECT *
FROM CTE
WHERE RowNum BETWEEN (@PageNumber - 1) * @PageSize + 1 AND @PageNumber * @PageSize;
示例:
假设每页 10 条,查询第 3 页数据:
DECLARE @PageNumber INT = 3;
DECLARE @PageSize INT = 10;
WITH CTE AS (
SELECT
*,
ROW_NUMBER() OVER (ORDER BY Id) AS RowNum
FROM YourTable
)
SELECT *
FROM CTE
WHERE RowNum BETWEEN (@PageNumber - 1) * @PageSize + 1 AND @PageNumber * @PageSize;
3. 适用于更早版本:通过 TOP
和子查询分页
在 SQL Server 2000 或更早版本中,没有 ROW_NUMBER()
函数,可以结合 TOP
和子查询实现分页,但性能较差,不推荐使用。
SELECT TOP @PageSize *
FROM YourTable
WHERE Id NOT IN (
SELECT TOP (@PageNumber - 1) * @PageSize Id
FROM YourTable
ORDER BY Id
)
ORDER BY Id;
对比分析
方法 | 适用版本 | 优点 | 缺点 |
---|---|---|---|
OFFSET + FETCH | SQL Server 2012+ | 简洁高效,代码可读性强 | 需要指定排序列 |
ROW_NUMBER() + CTE | SQL Server 2005+ | 灵活,适用性广 | 写法稍复杂,性能略低 |
TOP + 子查询 | SQL Server 2000+ | 适合老旧版本 | 复杂且性能差 |
总结
如果使用的是 SQL Server 2012 或更高版本,优先使用 OFFSET
和 FETCH
方法。对于较老版本,建议通过 ROW_NUMBER()
和子查询的方式实现分页,能更好地控制性能和灵活性。