1、SQL Server 2008及以前版本

在 SQL Server 2008 中,由于没有 OFFSETFETCH 子句,我们通常使用 ROW_NUMBER() 函数来实现分页。以下是一个使用 ROW_NUMBER() 函数进行分页的示例:

DECLARE @PageNumber INT = 2;  -- 当前页码
DECLARE @PageSize INT = 10;   -- 每页显示的记录数

;WITH PaginationCTE AS (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY [YourOrderByColumn]) AS RowNum,
        [YourColumnNames]
    FROM 
        [YourTableName]
)
SELECT 
    [YourColumnNames]
FROM 
    PaginationCTE
WHERE 
    RowNum BETWEEN ((@PageNumber - 1) * @PageSize + 1) AND (@PageNumber * @PageSize);

在这个示例中:

  • @PageNumber 是当前页码,@PageSize 是每页显示的记录数。
  • PaginationCTE 是一个公共表表达式(CTE),它使用 ROW_NUMBER() 函数为表中的每行生成一个唯一的行号。
  • 在 WHERE 子句中,我们使用 RowNum 来筛选出当前页需要显示的记录。

请将 [YourTableName] 替换为你的表名,[YourOrderByColumn] 替换为你的排序列名,[YourColumnNames] 替换为你想要查询的列名。

这种方法适用于 SQL Server 2008,并且可以根据需要调整页码和每页显示的记录数来实现分页查询。

SQL Server 2012 及更高版本

SQL Server 2012 及更高版本除了能用像SQL Server 2008及以前版本的方式之外,还可以使用OFFSETFETCH 子句来实现分页查询。以下是一个基本的分页查询示例:

SELECT [column1], [column2], ...
FROM [YourTableName]
ORDER BY [YourOrderByColumn]
OFFSET [PageSize] ROWS
FETCH NEXT [PageSize] ROWS ONLY;

这里的 [YourTableName] 是你的表名,[column1][column2] 是你想要查询的列名,[YourOrderByColumn] 是你想要排序的列名,[PageSize] 是你每页想要显示的行数。

例如,如果你有一个名为 Orders 的表,并且想要查询第 2 页的数据,每页显示 10 行,你可以这样写:

SELECT [OrderID], [OrderDate], [CustomerID]
FROM [Orders]
ORDER BY [OrderID]
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

在这个例子中,OrderID 是排序和分页的列,我们跳过第一页的 10 行数据,然后获取接下来的 10 行数据。

请注意,OFFSET 子句指定了要跳过的行数,而 FETCH NEXT 子句指定了要返回的行数。对于第 2 页,你需要跳过第一页的 10 行(即 10),然后获取接下来的 10 行。

这种方法适用于 SQL Server 2012 及更高版本。如果你使用的是 SQL Server 2008 或更早的版本,你需要使用不同的方法,比如使用 ROW_NUMBER() 函数。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐