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
相关产品推荐
相关产品推荐

