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

SQL在列表上迭代以对每个项调用EXEC,sql,stored-procedures,loops,iteration,exec,Sql,Stored Procedures,Loops,Iteration,Exec,试图概括我的问题。。。 我想为SELECT语句返回的每个结果执行一个存储过程 精神上我想尝试一下 EXEC myStoredProc从sometable中选择id,其中cond=@param 关于我的具体案例的更多细节。。。 我有一个SaaS应用程序。我想从系统中删除租户。在删除租户之前,我必须删除数据库中与该租户关联的所有记录 租户拥有诸如表单之类的项,这些项包含许多不同类型的字段。我已经有了一个存储过程,可以删除表单及其所有相关项(如字段)。出于维护原因,即不想重复确定记录和表单之间依赖关系

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

精神上我想尝试一下 EXEC myStoredProc从sometable中选择id,其中cond=@param

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

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

我可以通过运行如下查询来检索表单列表。。。 从其中Tenant=@TenantId的表单中选择formId

我想对该查询的结果执行EXEC my Delete_Form存储过程


如何执行此操作?

您只需打开“级联删除”,删除父记录将删除与其关联的所有子记录


如果没有,您将不得不创建一个链接,该链接是针对sql server的,但我会假设其他RDBMS的游标是类似的,并在每个结果中循环,拉出表单id并对每个结果执行[Delete_Field_Procedure]

如果您无法控制外键并且无法执行级联删除,则可以创建一个游标来循环遍历并为每个外键执行存储的过程

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

谢谢你的回复,凯文。我觉得级联删除有太多的魔力,有些东西可能会意外消失。所以我要用你提到的游标:谢谢。