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

SQL Server 2012中动态执行DELETE语句后@@ROWCOUNT返回0的问题求助

问题根源与解决办法

嘿,这个问题我之前也碰到过——你执行完动态DELETE后的print @query语句把@@ROWCOUNT给重置了!

SQL Server里的@@ROWCOUNT是个“即时生效”的变量:它只会保存上一条T-SQL语句影响的行数,而且任何后续语句(哪怕是PRINT、SELECT @@VERSION这种不修改数据的操作)都会把它覆盖成自己的执行结果。PRINT语句执行后不会影响任何行,所以它会把@@ROWCOUNT设为0,这就是你插入日志时拿到0的原因。

快速修复:立即捕获行数

最简单的解决方式,就是在exec执行完动态语句后,立刻把@@ROWCOUNT存入一个变量,别让后续的PRINT或者其他语句碰它:

declare @query nvarchar(max)='delete from '+ @table_name + ' where kfh_id=' + cast(@kfh_id as varchar)
declare @rowsDeleted int -- 新增变量存行数

exec (@query)
set @rowsDeleted = @@ROWCOUNT -- 这里必须紧跟exec,中间不能加任何语句

print @query -- 现在print不影响已经保存的变量了
insert into tbl_cleanup_log (tablename,kfh_id,rows_affected,remark,deletiontime)
values(@table_name,@kfh_id,@rowsDeleted,@query,getdate())

更稳健的方案:用sp_executesql传递输出参数

如果你的动态SQL场景更复杂,推荐用sp_executesql代替直接exec,它支持输入输出参数,能更安全地获取行数,还能避免SQL注入风险(顺便提醒下:用QUOTENAME(@table_name)包裹表名,能防止表名带特殊字符时的语法错误):

declare @query nvarchar(max)
declare @rowsDeleted int

-- 用QUOTENAME处理表名,避免语法错误
set @query = N'delete from ' + QUOTENAME(@table_name) + N' 
               where kfh_id=' + cast(@kfh_id as varchar) + N'
               SET @rows = @@ROWCOUNT'

-- 通过输出参数获取行数
exec sp_executesql 
    @stmt = @query,
    @params = N'@rows int OUTPUT',
    @rows = @rowsDeleted OUTPUT

print @query
insert into tbl_cleanup_log (tablename,kfh_id,rows_affected,remark,deletiontime)
values(@table_name,@kfh_id,@rowsDeleted,@query,getdate())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:57:39