2012-01-05 11 views
1

特定の条件の下でデータベースから行の束を削除する必要があります。私はこの条件を返すselect文を持っています。そして、このselect文の各行に対して、これらの行と関連する行のロードを削除するSPを実行する必要があります。これまでのところ私が持っている:そしてSelect文で返されるIDを使用するループfor SQL

select importfileid from import.importfiles where importfilestatusid < 7 

と私はちょうど中間に操作を行う方法がわからないんだけど

EXEC [import].[spDeleteFromAllImportRelatedTables] 
    @fileID = @importfileid 

を実行しますか?誰かが私を正しい方向に向けることができれば、それは素晴らしいものになるでしょう。

NB:これは一時的なものです。パフォーマンスは問題ではありません。

答えて

2

に見て:

declare @importFileID int 
declare @cur cursor 

set @cur = cursor fast_forward for 
select importfileid from import.importfiles where importfilestatusid < 7 

open @cur 
fetch next from @cur into @importFileID 
while(@@fetch_status = 0) 
begin 
    exec [import].[spDeleteFromAllImportRelatedTables] @fileID = @importFileID 
    fetch next from @cur into @importFileID 
end 
close @cur 
deallocate @cur 
+0

+1これはビートします – Curt

+0

これは完璧でした。私はカーソルについて知りませんでした。おそらく、カーソルを削除するたびに選択したでしょう。私はこれらを読む必要があります。 NB: '=' not '=='。 +1 – ediblecode

+0

もちろん '='ではなく、 '=='ではなく、短時間SQLを使用しないと、私はいつも忘れています:) – Matten

-1

私はSPだけの行を削除するよりも何か特別なことをやっていると仮定します。

これはワンオフの事であるならば、あなただけのハック何かのように行うことができます:

SELECT 'EXEC [import].[spDeleteFromAllImportRelatedTables] @fileID =', importfileid from import.importfiles where importfilestatusid < 7 

をそしてコピー&ペーストの結果をして、それを実行しますか?

これはスケジュールされたクリーンアップの場合、あなたのコードを再考し、DeleteFromAllImportRelatedTablesの機能を実行する新しいSPを作成することを考慮してください。多少のコード​​の重複はあるかもしれませんが、問題を見つけるためにSP内のSP呼び出しをトレースしないので、何が起きているのか、さらに簡単にデバッグするのをより早く理解しやすくなります。

0

私は決してカーソルを使用するように提案するつもりはなく、SETベースのアプローチに行きます。可能であれば、すべての相対テーブルの結合を使用して、それらの行をすべて削除することができます。それはより速いアプローチでしょう。 1つのSPを作成し、特定の間隔でこれを行う1つのジョブを作成すると、人生は簡単になります。

+0

opはちょうどこれを何度か何度もやりたい* fast *は本当に重要ではないので、カーソルをもう一度言います。 – Matten

+0

@Mattenあなたは正しいですが、問題を解決するために私の視点を共有しています。私は違う方法で言いました。違反はありません。 –

+0

私は全くあなたに同意します。セットベースの操作は、t-sqlの手続き型プログラミングに依存するよりも、常に(大きさ)高速です。 – Matten

0

あなたにはいくつかのオプションがありますが、どれもきれいです。

は(早送り読み取り専用)カーソルでカーソル

を使用して、一度に検索結果の1をループをCNおよびあなたのストアドプロシージャを呼び出します。


保持テーブル

テーブルにすべてのレコードを挿入し、そのテーブルから読み取るストアドプロシージャを記録します。

これは実際のテーブルまたは#temporary_tableです。

これは、反復ループではなく、すべての削除を一緒に実行できるという利点があります。


あなたが関数にあなたのSELECTコードを配置する場合は、再コードSPを削除するレコードを検索し、その関数を呼び出すことができる機能

の最初のステップをカプセル化します。 SPのパラメータは、Functionのパラメータが何であってもそれになります。


これは、テーブルパラメータを使用してSQL Server 2008+で多少整えられています。しかし、SQL Server 2005ではありません。

+0

'fast_forward'は' read_only'(と 'forward_only')を意味します – Matten

関連する問題