0

私のテーブルには3つ以上の列が保存されている画像ファイルパスがあるので、データを削除するときに指定テーブル「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

再び失敗する

問題は、削除されたテーブルのスコープを使用できることだと思います。削除されたテーブルはprocsp_executesqlでアクセスできません。

だから私にできるのは、この問題を回避するための一時テーブルを作成することだけですが、そうであれば、この単純な目標のために、トリガー、カーソル、誘惑可能およびサブプロシージャの呼び出しを使用しました、私は本当に計算のコストを気にします

誰かがより良い解決策を持っているなら?

PS:プールの英語とプールの質問をお詫びします

PPS:私はこの複雑なことをする必要性について何か問題があることを知っています、私たちのチームのプログラマーがデータを削除すると同時にファイルを削除することをいとわないなら、私はこれをする必要はありませんが、彼らはしません、だから私は自分のスケールで試してみます

4

1 に答える 1

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

それははるかに良い考えです。

于 2012-11-29T15:37:10.463 に答える