在 MSSQL(Microsoft SQL Server)中,可以通过以下几种方式实现分页查询,具体方式取决于使用的 SQL Server 版本。

1. 适用于 SQL Server 2012 及以上版本:使用 OFFSETFETCH 子句

这是推荐的方式,语法简洁且性能较好。

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()

这些版本没有 OFFSETFETCH,可以通过 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 + FETCHSQL Server 2012+简洁高效,代码可读性强需要指定排序列
ROW_NUMBER() + CTESQL Server 2005+灵活,适用性广写法稍复杂,性能略低
TOP + 子查询SQL Server 2000+适合老旧版本复杂且性能差

总结

如果使用的是 SQL Server 2012 或更高版本,优先使用 OFFSETFETCH 方法。对于较老版本,建议通过 ROW_NUMBER() 和子查询的方式实现分页,能更好地控制性能和灵活性。