Tsql T-SQL:exec()&sp_executedsql无法使用插入和删除作为输入参数
在我的表中,有三列或更多列存储了图像文件路径,因此当数据要删除时,我需要将图像文件路径存储到指定表“OnDeleteFile”,然后使用任务方法从该指定表中删除web服务器中的文件 但是有很多这样的表,我不想每次都在触发器中写入,以将每一列插入到表OnDeleteFile中,如下所示: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
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解决方案也很好!