1、SQL Server 2008及以前版本
在 SQL Server 2008 中,由于没有 OFFSET
和 FETCH
子句,我们通常使用 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及以前版本的方式之外,还可以使用OFFSET
和 FETCH
子句来实现分页查询。以下是一个基本的分页查询示例:
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()
函数。