5

質問を一般化しようとしています... SELECT ステートメントによって返される各結果に対してストアド プロシージャを実行したいと考えています。

精神的には、EXEC myStoredProc (SELECT id FROM sometable WHERE cond = @param) のようなものを試してみたい

私の特定のケースに関連する詳細... 私は SaaS アプリケーションを持っています。システムからテナントを削除したいと考えています。テナントを削除する前に、そのテナントに関連付けられているデータベース内のすべてのレコードを削除する必要があります。

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

次のようなクエリを実行して、フォームのリストを取得できます... Select formId FROM Forms WHERE Tenant = @TenantId

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

これどうやってするの?

4

2 に答える 2

8

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

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
于 2009-05-13T19:02:44.023 に答える
2

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

そうでない場合は、カーソルを作成する必要があります(リンクはSQLサーバー用ですが、他のRDBMSのカーソルも同様であると想定します)、各結果をループしてフォームIDを引き出し、それぞれに対して[Delete_Field_Procedure]を実行します1。

于 2009-05-13T19:00:49.910 に答える