You need to enable JavaScript to run this app. SQL Server存储过程@@ROWCOUNT行数不符的问题求解
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程@@ROWCOUNT行数不符的问题求解

问题根因

你遇到的行数不匹配的核心原因有两个:

  • 当前存储过程会同时输出两个独立的结果集:第一个是全量查询的交易明细(共5781行),第二个是SELECT @@ROWCOUNT返回的单值计数结果(1行)。SSMS界面底部统计的“返回总行数”是所有结果集的行数累加值,两个结果集加起来本来就会比单查询的明细行数高,差值就是第二个结果集的行数。
  • 你原本的需求是“仅返回符合条件的总记录数”,但现有逻辑完全保留了明细返回的部分,既会产生不必要的数据传输开销,也会导致SSMS的行数统计偏差。
修正后的存储过程代码

按照你“仅返回符合条件总记录数”的需求,直接去掉明细查询逻辑,改用COUNT(*)聚合直接统计匹配行数即可:

ALTER PROCEDURE [dbo].[GetTransactionsFromTransactionRecordForMonthYear]
    @Guid   nvarchar(50),
    @Month  int,
    @Year   int
AS
BEGIN
    SET NOCOUNT ON; 
    -- 直接返回匹配的总记录数,无明细输出
    SELECT COUNT(*) AS MatchedRecordCount
    FROM Company.TransactionRecord
    WHERE 
        CorporationId = @Guid 
        AND MONTH(TransactionDate) = @Month 
        AND YEAR(TransactionDate) = @Year
END
如果你需要同时返回明细和计数

如果业务上既需要拿到全量明细,又需要单独返回准确的匹配行数,需要注意@@ROWCOUNT的值是当前会话上一条语句的执行结果,必须在明细查询执行完成后立刻把值存入变量,避免被其他语句覆盖:

ALTER PROCEDURE [dbo].[GetTransactionsFromTransactionRecordForMonthYear]
    @Guid   nvarchar(50),
    @Month  int,
    @Year   int
AS
BEGIN
    SET NOCOUNT ON; 
    -- 先执行明细查询
    SELECT *
    FROM Company.TransactionRecord
    WHERE 
        CorporationId = @Guid 
        AND MONTH(TransactionDate) = @Month 
        AND YEAR(TransactionDate) = @Year
    -- 立刻捕获上一条查询的行数,存入变量
    DECLARE @MatchedRecordCount INT = @@ROWCOUNT
    -- 单独输出准确的匹配行数
    SELECT @MatchedRecordCount AS MatchedRecordCount
END
额外性能优化提示

当前查询里对TransactionDate字段用了MONTH()、YEAR()函数做条件判断,会导致该字段上的普通索引失效,触发全表扫描拖慢查询性能。可以把日期条件改成范围匹配,让查询可以正常命中索引:

-- 替换原来的月份/年份判断条件
WHERE
    CorporationId = @Guid
    -- 匹配指定年月的日期范围:从当月1号0点,到下月1号0点前
    AND TransactionDate >= DATEFROMPARTS(@Year, @Month, 1)
    AND TransactionDate < DATEADD(MONTH, 1, DATEFROMPARTS(@Year, @Month, 1))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 21:54:08