@@ROWCOUNT在使用动态查询SQL进行删除时显示为0



我在使用动态查询和尝试使用@ROWCOUNT 获取已删除记录的数量时遇到了麻烦

这是我的QUERI

declare @query nvarchar(max)='delete from '+ @table_name + ' where kfh_id=' + cast(@kfh_id as varchar)
--print @query
exec (@query)
print @query
insert into tbl_cleanup_log (tablename,kfh_id,rows_affected,remark,deletiontime)
values(@table_name,@kfh_id,@@ROWCOUNT,@query,getdate())

在dyanimic删除查询(在我的光标内(之后,我试图使用@ROWCOUNT将已删除记录的数量存储到另一个表中。但它显示为0。

我不明白我做错了什么。

我的SQL版本是2012

@@ROWCOUNT工作正常。来自文件:

返回受上一条语句影响的行数。如果行数超过20亿,请使用ROWCOUNT_BIG。

您在其中使用@@ROWCOUNT的语句的前一个语句是print @query,它不返回任何行,因此@@ROWCOUNT返回0

为了解决这个问题,我建议先使用PRINT动态语句。此外,您还需要修复您的动态语句,这样它就不会被注入。不要使用语法EXEC (@SQL),使用对sys.sp_executesql的参数化调用,并确保使用QUOTENAME:正确地定界标识动态对象

DECLARE @table_name sysname,
@kfh_id int; --Guessed data type
DECLARE @query nvarchar(MAX) = N'delete from dbo.' + QUOTENAME(@table_name) + N' where kfh_id= @kfh_id;'; --Schema is guessed.
PRINT @query;
EXEC sys.sp_executesql @query, N'@kfh_id int', @kfh_id; --Reminder, guessed @kfh_id data type
INSERT INTO tbl_cleanup_log (tablename,
kfh_id,
rows_affected,
remark,
deletiontime)
VALUES (@table_name, @kfh_id, @@ROWCOUNT, @query, GETDATE());

@ROWCOUNT应该是在语句之后立即使用的,这里的PRINT介于和它正在更改结果之间:

DECLARE @row_cnt INT;
EXEC (@query);
SET @row_cnt = @@ROWCOUNT;
print @query;
insert into tbl_cleanup_log (tablename,kfh_id,rows_affected,remark,deletiontime)
values(@table_name,@kfh_id,@row_cnt ,@query,getdate());

最新更新