SQLは、各項目にEXECを呼び出すために、リストを反復処理します
-
21-08-2019 - |
質問
私の質問を一般化しようと... 私は、SELECT文によって返された各結果のためのストアドプロシージャを実行します。
精神的に私のようなものを試してみたいです EXEC myStoredProc(WHERE COND = @param sometableからIDを選択)
私の特定のケースに関連する詳細... 私は、SaaSアプリケーションを持っています。私はシステムからテナントを削除したいと思います。私はテナントを削除することができます前に、私はそのテナントに関連付けられたデータベース内のすべてのレコードを削除する必要があります。
テナントは、そのようなフィールドの多くの異なる種類を含むフォームなどのアイテムを所有しています。私はすでにフォームと(フィールドなど)は、その関連アイテムのすべてを削除するストアドプロシージャを持っています。メンテナンス上の理由(Ieは。レコードとフォームの間dependancesとの関連付けを決定するロジックを複製したかったではない)のために私はちょうどテナントに属する各フォームのためにそれにStoredProcを呼び出すしたいと思います。
私のようなクエリを実行することにより、フォームのリストを取得することができます... テナント= @TenantId
フォームからフォームIDを選択します私はそのクエリの結果でやりたいことはEXEC私Delete_Formストアドプロシージャです。
私はこれを行うことができますどのように?
解決
あなたが外部キーのコントロールを持っていないとカスケード削除を行うことができない場合は、あなたは、スルーループにカーソルを作成することができますし、それぞれのストアドプロシージャを実行します。
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
他のヒント
あなただけのカスケードの削除回すことができると親レコードを削除すると、それに関連するすべての子レコードを削除します。
あなたはカーソルを作成する必要がありますされていない場合(リンクは、SQLサーバーのためのものであるが、私は、フォームIDを引き抜くとそれぞれについて[Delete_Field_Procedure】実行結果のそれぞれを介して他のRDBMSのカーソルが類似していると仮定)、ループになります。