Tsql T-SQL:exec()&sp_executedsql无法使用插入和删除作为输入参数

Tsql T-SQL:exec()&sp_executedsql无法使用插入和删除作为输入参数,tsql,execute,sp-executesql,Tsql,Execute,Sp Executesql,在我的表中,有三列或更多列存储了图像文件路径,因此当数据要删除时,我需要将图像文件路径存储到指定表“OnDeleteFile”,然后使用任务方法从该指定表中删除web服务器中的文件 但是有很多这样的表,我不想每次都在触发器中写入,以将每一列插入到表OnDeleteFile中,如下所示: insert into OnDeleteFile(filePath) select column1 from deleted, insert into OnDeleteFile(filePath) select

在我的表中,有三列或更多列存储了图像文件路径,因此当数据要删除时,我需要将图像文件路径存储到指定表“OnDeleteFile”,然后使用任务方法从该指定表中删除web服务器中的文件 但是有很多这样的表,我不想每次都在触发器中写入,以将每一列插入到表OnDeleteFile中,如下所示:

insert into OnDeleteFile(filePath) select column1 from deleted,
insert into OnDeleteFile(filePath) select column2 from deleted,
insert into OnDeleteFile(filePath) select column3 from deleted
declare mycursor cursor fast_forward
for select columnName from #temptable where isContent=0 
open mycursor
fetch next from mycursor into @column 
while @@fetch_status = 0
begin
    select @sqlstr='insert into OnDeleteFile(fileType,filePath) select fileType=''image'',@columnName from deleted where @columnName is not null and @columnName <> '''' '
    exec sp_executesql
    @stat=@sqlstr,
    @params=N'@columnName as varchar(255)',
    @columnName=@column
    fetch next from mycurosr into @column 
end
有这么多的表和这么多的列,所以我希望我可以通过循环来完成

tsql如下所示:

insert into OnDeleteFile(filePath) select column1 from deleted,
insert into OnDeleteFile(filePath) select column2 from deleted,
insert into OnDeleteFile(filePath) select column3 from deleted
declare mycursor cursor fast_forward
for select columnName from #temptable where isContent=0 
open mycursor
fetch next from mycursor into @column 
while @@fetch_status = 0
begin
    select @sqlstr='insert into OnDeleteFile(fileType,filePath) select fileType=''image'',@columnName from deleted where @columnName is not null and @columnName <> '''' '
    exec sp_executesql
    @stat=@sqlstr,
    @params=N'@columnName as varchar(255)',
    @columnName=@column
    fetch next from mycurosr into @column 
end
并且它运行错误:对象名称“已删除”无效

我试着这样做:

declare mycursor cursor fast_forward
for select columnName from #temptable where isContent=0 
open mycursor
fetch next from mycursor into @column 
while @@fetch_status = 0
begin
    exec('insert into OnDeleteFile(fileType,filePath) select fileType=''image'','+ @column +' from deleted where '+ @column + ' is not null and '+ @column + ' <> '''' ')
end
再次失败

我认为问题在于可以使用已删除表的范围,在proc sp_executesql中无法访问已删除表

所以我唯一能做的就是创建一个临时表来解决这个问题,但是如果是这样的话,为了这个简单的目标,我使用了触发器、游标、诱饵和子过程调用,我真的很关心计算的成本

如果有人有更好的解决方案

PS:我很抱歉我的台球英语和我的台球问题


PPS:我知道做这件复杂事情的需求有问题,如果我们团队中的程序员愿意在删除数据的同时删除文件,我将不需要这样做,但他们不会,所以我只是在我的秤上试一下

不,不要那样做,用你不想做的方式来做

insert into OnDeleteFile(filePath) select column1 from deleted,
insert into OnDeleteFile(filePath) select column2 from deleted,
insert into OnDeleteFile(filePath) select column3 from deleted

这是一个更好的主意。

存储图像文件路径的三列或更多列似乎是导致根本问题的原因。您是否考虑过重组为第一范式?您可以在一个insert语句中取消PIVOT column1、column2、column3。在大多数情况下,第三范式是规范化的基线,因此我无法说服自己打破规则,我认为这可能会导致比解决问题更多的问题,出于某种原因,我想这样做,但不幸的是,项目几乎完成了,如果我改变了表格结构,会对项目造成更多的变化,这将是另一个大问题,尽管如此,还是要谢谢你的好意我是说,你现在似乎还不是正常人,因为你似乎有一个重复的组。插入到OnDeleteFile文件路径中,从T UNPIVOT image_path中选择image_path作为第1列、第2列、第3列中的列名U;只需扫描一次deleted@MartinSmith,是的,但扫描是一个沉重的词,通常只有一行。@Ben非常感谢,你简单的回答让我意识到这是我应该做的工作,虽然它重复了,但它是更好的性能解决方案,这是我的义务,也是我的责任job@MartinSmith解决方案也很好!