You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储过程分页异常:请求行数超最后一页可用量时返回0行求助

解决分页存储过程最后一页返回0行的问题

兄弟,我太懂你这个分页坑了!之前维护老系统的时候也碰到过一模一样的问题——明明最后一页还有几行数据,结果调用存储过程直接返回空,排查半天才发现是分页逻辑里的小错误。

问题根源

通常这个问题出在两个地方:

  • 存储过程里加了多余的判断逻辑,比如提前计算总行数后,错误地认为偏移量超过总行数就直接返回空(但实际上偏移量之后还有剩余行);
  • 分页写法本身有缺陷,比如用了不合适的TOP或WHERE条件限制了返回结果。

解决方案

根据不同的SQL Server版本,给你两种靠谱的写法:

方案1:用SQL Server 2012+支持的OFFSET/FETCH标准语法(推荐)

这个语法本身就会自动处理最后一页的剩余行数,完全不需要额外判断,是最简洁的写法:

CREATE PROCEDURE GetPagedData
    @PageNumber INT,
    @PageSize INT
AS
BEGIN
    SET NOCOUNT ON;

    -- 先做参数合法性校验,避免传入负数或0
    SET @PageNumber = CASE WHEN @PageNumber < 1 THEN 1 ELSE @PageNumber END;
    SET @PageSize = CASE WHEN @PageSize < 1 THEN 10 ELSE @PageSize END; -- 默认每页10行

    -- 核心分页逻辑
    SELECT *
    FROM YourTable -- 替换成你的表名
    ORDER BY Id ASC -- 必须加ORDER BY,保证分页结果稳定(替换成你的排序字段)
    OFFSET (@PageNumber - 1) * @PageSize ROWS
    FETCH NEXT @PageSize ROWS ONLY;
END

举个例子:如果你的表有17条数据,@PageSize=10,@PageNumber=2,这个语句会自动返回第11-17行(共7条),而不是0行。

方案2:兼容SQL Server 2008及更早版本(用ROW_NUMBER())

如果项目还在用老版本SQL Server,用ROW_NUMBER()的时候注意不要加错误的TOP限制,正确写法如下:

CREATE PROCEDURE GetPagedData
    @PageNumber INT,
    @PageSize INT
AS
BEGIN
    SET NOCOUNT ON;

    -- 参数校验
    SET @PageNumber = CASE WHEN @PageNumber < 1 THEN 1 ELSE @PageNumber END;
    SET @PageSize = CASE WHEN @PageSize < 1 THEN 10 ELSE @PageSize END;

    DECLARE @StartRow INT = (@PageNumber - 1) * @PageSize + 1;
    DECLARE @EndRow INT = @StartRow + @PageSize - 1;

    SELECT *
    FROM (
        SELECT 
            *,
            ROW_NUMBER() OVER (ORDER BY Id ASC) AS RowNum -- 排序字段要和外层一致
        FROM YourTable
    ) AS PagedData
    WHERE RowNum BETWEEN @StartRow AND @EndRow;
END

这个写法里,即使@EndRow超过了表的总行数,BETWEEN也会自动匹配到最后一行,返回剩余的所有数据。

要避免的错误写法

如果你的存储过程里有类似下面的代码,一定要删掉!这就是导致最后一页返回0行的罪魁祸首:

DECLARE @TotalRows INT;
SELECT @TotalRows = COUNT(*) FROM YourTable;

-- 错误判断:直接返回空,忽略了偏移量后还有剩余行的情况
IF (@PageNumber - 1) * @PageSize >= @TotalRows
BEGIN
    RETURN;
END

内容的提问来源于stack exchange,提问作者usefulBee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:09:58