2009-05-13 5 views
4

質問を一般化しようとしています... SELECT文によって返される各結果に対してストアドプロシージャを実行します。SQLが各項目のEXECを呼び出すためにリストを反復する

精神的に私は私がSaaSアプリケーションを持っている ... EXEC myStoredProc(WHERE指揮= @param sometableからIDを選択します)私の特定のケースに関連し

詳細のようなものを試してみたいです。私はシステムからテナントを削除したいと思います。テナントを削除する前に、そのテナントに関連付けられたデータベース内のすべてのレコードを削除する必要があります。

テナントは、さまざまな種類のフィールドを含むフォームなどのアイテムを所有しています。私はすでにFormとそれに関連するすべての項目(Fieldsなど)を削除するストアドプロシージャを持っています。メンテナンス上の理由(つまり、レコードとフォームの間の依存関係や関連性を決定するロジックを複製したくない)では、テナントに属する各フォームに対してStoredProcを呼び出すだけです。

私は、フォームからの問い合わせのような... 選択フォームIDを実行して、フォームのリストを取得することができますWHEREテナント= @TenantId

私はそのクエリの結果でやりたいことは、私のDelete_FormストアドプロシージャEXECです。

どうすればいいですか?

+0

どのRDBMSを使用していますか? –

+0

Microsoft SQL Server 2008 – Justin

答えて

6

外部キーの制御がなく、カスケード削除を実行できない場合は、カーソルを作成してループスルーし、それぞれのストアドプロシージャを実行することができます。

declare @formID int 
declare FormsCursor cursor fast_forward for Select formId FROM Forms WHERE Tenant = @Tenant 

open FormsCursor 

fetch next from FormsCursor into @formID 

while @@fetch_status = 0 
begin 

    exec Delete_Form @formID 

    fetch next from FormsCursor into @formID 

end 

close FormsCursor 
deallocate FormsCursor 
+0

うわー、完璧な感謝! – Justin

2

カスケード削除を有効にするだけで、親レコードを削除すると、それに関連付けられているすべての子レコードが削除されます。

cursorを作成する必要がない場合は(SQL Server用のリンクですが、他のRDBMS用のカーソルも同様であると仮定します)、それぞれの結果をループしてフォームIDを取り出し、[ Delete_Field_Procedure]を入力します。

+0

ご回答ありがとうございます。私はカスケード削除で起こっている "マジック"があまりにも多くあり、誤っていくつかのものが消えるかもしれないと感じています。 私はあなたが言及したカーソルで行くつもりです:)ありがとう。 – Justin

関連する問題