2009-05-13 5 views
4

Tentative de généraliser mes questions ... Je souhaite exécuter une procédure stockée pour chaque résultat renvoyé par une instruction SELECT.SQL itérer sur une liste pour appeler EXEC sur chaque élément

Mentalement, je veux essayer quelque chose comme EXEC myStoredProc (SELECT id DE sometable OU = @param cond)

Plus de détails liés à mon cas précis ... J'ai une application SaaS. Je voudrais supprimer un locataire du système. Avant de pouvoir supprimer le locataire, je dois supprimer tous les enregistrements de la base de données associée à ce locataire.

Les locataires possèdent des éléments tels que des formulaires contenant de nombreux types de champs différents. J'ai déjà un proc stocké qui supprime un formulaire et tous ses éléments associés (comme les champs). Pour des raisons de maintenance (c'est-à-dire que je ne voulais pas dupliquer la logique qui détermine les dépendances et les associations entre les enregistrements et un formulaire), je voudrais juste appeler ce StoredProc pour chaque formulaire qui appartient à un locataire.

je peux récupérer la liste des formulaires en exécutant une requête comme ... Sélectionnez formId des formulaires OU locataire = @TenantId

Ce que je veux faire avec le résultat de cette requête est EXEC ma procédure stockée Delete_Form .

Comment est-ce que je peux faire ceci?

+0

Quels SGBDR utilisez-vous? –

+0

Microsoft SQL Server 2008 – Justin

Répondre

6

Dans le cas où vous n'avez pas le contrôle des clés étrangères et ne pouvez pas effectuer de suppression en cascade, vous pouvez créer un curseur pour faire une boucle et exécuter le proc stocké pour chacune.

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 
+0

Wow parfait merci! – Justin

2

Vous pouvez simplement activer la suppression Cascade et la suppression de l'enregistrement parent supprimerait tous les enregistrements enfants qui lui sont associés.

Sinon, vous devrez créer un cursor (Le lien est pour le serveur sql, mais je suppose que les curseurs pour d'autres SGBDR sont similaires) et la boucle à travers chacun des résultats tirant le formulaire ID et exécutant le [ Delete_Field_Procedure] pour chacun.

+0

Merci pour votre réponse Kevin. Je pense qu'il y a trop de "magie" qui se passe avec Cascade et certaines choses peuvent accidentellement disparaître. Donc, je vais avec des curseurs que vous avez mentionné :) Merci. – Justin

Questions connexes