5

尝试概括我的问题...我想为 SELECT 语句返回的每个结果执行一个存储过程。

精神上我想尝试类似 EXEC myStoredProc (SELECT id FROM sometable WHERE cond = @param)

与我的具体案例相关的更多细节......我有一个 SaaS 应用程序。我想从系统中删除一个租户。在我可以删除租户之前,我必须删除与该租户关联的数据库中的所有记录。

租户拥有诸如包含许多不同类型字段的表单之类的项目。我已经有一个存储过程,可以删除表单及其所有关联项目(如字段)。出于维护原因(即不想重复确定记录和表单之间的依赖关系和关联的逻辑),我只想为属于租户的每个表单调用该 StoredProc。

我可以通过运行如下查询来检索表单列表... Select formId FROM Forms WHERE Tenant = @TenantId

我想要对该查询的结果执行的是执行我的 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 server,但我假设其他 RDBMS 的游标是相似的)并循环遍历每个结果,提取表单 ID 并为每个执行 [Delete_Field_Procedure]一。

于 2009-05-13T19:00:49.910 回答