存储过程中@@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
相关产品推荐
相关产品推荐

