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

