SQL迭代列表以在每个项目上调用EXEC

时间:2009-05-13 18:57:57

标签: sql stored-procedures loops iteration exec

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

我很想尝试类似的东西 EXEC myStoredProc(SELECT id FROM sometable WHERE cond = @param)

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

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

我可以通过运行像...这样的查询来检索表单列表 选择formId FROM Forms WHERE Tenant = @TenantId

我想对该查询的结果做的是EXEC我的Delete_Form存储过程。

我该怎么做?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您可以启用Cascade delete并删除父记录将删除与其关联的所有子记录。

如果不是,你将不得不创建一个cursor(该链接用于sql server,但我会假设其他RDBMS的游标类似)并循环遍历每个结果,取出表单id和为每个执行[Delete_Field_Procedure]。