T-SQL:exec()& sp_executedsql无法使用inserted&被检测为输入参数

时间:2012-11-29 15:00:47

标签: tsql execute sp-executesql

在我的表中有三列或更多列存储图像文件路径,所以我需要将图像文件路径存储到指定表'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

有很多表和很多列,所以我希望我能通过循环

来做到这一点 像这样的tsql:

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

所以我唯一能做的就是创建一个临时表来解决这个问题,但如果是这样,对于这个简单的目标,我使用了触发器,游标,temptable和子程序调用,我真的非常关心计算的成本< / p>

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

PS:我很抱歉我的泳池英语和我的泳池问题

PPS:我知道做复杂事情的需要有些不对劲,如果团队中的程序员愿意在删除数据的同时删除文件,我就不需要这样做了,但是他们不会,所以我只是尝试我的规模

1 个答案:

答案 0 :(得分:2)

不,不要这样做,按照你不想做的方式去做。

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

这是一个更好的主意。