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

存储过程中@@ROWCOUNT始终返回0的问题求助

问题分析与解决:存储过程输出参数@count始终返回0

问题原因

你的代码存在核心逻辑问题:@@ROWCOUNT的值会被后续执行的T-SQL语句覆盖。

循环体中,执行完INSERT/DELETE语句后,@@ROWCOUNT原本记录的是这些数据操作的影响行数,但紧接着执行的SET @row = @@ROWCOUNT这条赋值语句,会将@@ROWCOUNT重置为1(语句执行成功时)。此时再执行SET @count = @count + @@ROWCOUNT,累加的已经不是INSERT/DELETE的真实影响行数,而是赋值语句的影响行数;如果INSERT/DELETE未命中任何数据,@@ROWCOUNT初始为0,赋值后循环直接退出,@count会保持初始的0值。

修复代码

解决思路是先把数据操作后的@@ROWCOUNT保存到临时变量,再用该变量更新循环条件和累加计数:

/****** Object:  StoredProcedure [dbo].[TestStoProc]    Script Date: 21.09.2023 13:32:40 ******/ 
ALTER PROCEDURE [dbo].[PurgeSyncOperations] 
   -- Parameters for the stored procedure here
     @Date datetime, 
     @CustomerNumber nvarchar(10),
     @count int = 0 output
AS
    BEGIN
        DECLARE @row INT;
        DECLARE @currentAffectedRows INT; -- 新增临时变量保存真实影响行数
        SET @row = 1;

        WHILE @row > 0
            BEGIN
            -- Statements for archiving and deletion

                //some query to insert data

                //some query to delete data

                SET @currentAffectedRows = @@ROWCOUNT; -- 先保存数据操作的影响行数
                SET @row = @currentAffectedRows;
                SET @count = @count + @currentAffectedRows;
            END
    END

额外验证项

  • 单独执行INSERT/DELETE语句,确认@@ROWCOUNT返回值大于0,确保语句能命中目标数据;
  • 调用存储过程时,正确声明并传递输出参数,示例调用代码:
DECLARE @totalCount INT;
EXEC [dbo].[PurgeSyncOperations] @Date = '2023-01-01', @CustomerNumber = '12345', @count = @totalCount OUTPUT;
SELECT @totalCount AS TotalAffectedRows;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:41:03