尝试概括我的问题...... 我想为SELECT语句返回的每个结果执行存储过程。
我很想尝试类似的东西 EXEC myStoredProc(SELECT id FROM sometable WHERE cond = @param)
与我的具体案例有关的更多细节...... 我有一个SaaS应用程序。我想从系统中删除租户。在我删除租户之前,我必须删除与该租户关联的数据库中的所有记录。
租户拥有的项目,例如包含许多不同类型的字段的表单。我已经有一个存储过程删除一个Form及其所有相关项(如Fields)。出于维护原因(即不想复制确定记录和表单之间的依赖关系和关联的逻辑)我想为每个属于租户的表单调用StoredProc。
我可以通过运行像...这样的查询来检索表单列表 选择formId FROM Forms WHERE Tenant = @TenantId
我想对该查询的结果做的是EXEC我的Delete_Form存储过程。
我该怎么做?
答案 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]。