2009-05-13 4 views
4

Versuch, meine Fragen zu verallgemeinern ... Ich möchte eine gespeicherte Prozedur für jedes Ergebnis ausführen, das von einer SELECT-Anweisung zurückgegeben wird.SQL über eine Liste iterieren, um EXEC für jedes Element aufzurufen

Psychisch Ich möchte so etwas wie EXEC myStoredProc (SELECT id FROM sometable WHERE cond = @param), um versuchen

Mehr Details zu meinem speziellen Fall im Zusammenhang ... ich eine SaaS-Anwendung hat. Ich möchte einen Mandanten aus dem System löschen. Bevor ich den Mandanten löschen kann, muss ich alle Datensätze in der Datenbank löschen, die diesem Mandanten zugeordnet sind.

Mieter besitzen Elemente wie Formulare, die viele verschiedene Arten von Feldern enthalten. Ich habe bereits eine gespeicherte Prozedur, die ein Formular und alle zugehörigen Elemente (wie Felder) löscht. Aus Gründen der Wartung (ich wollte nicht die Logik duplizieren, die Dependenzen und Assoziationen zwischen Datensätzen und einem Formular bestimmt) möchte ich das StoredProc für jedes Formular aufrufen, das zu einem Mandanten gehört.

kann ich die Liste der Formulare abrufen, indem Sie eine Abfrage ausgeführt wird, wie ... Wählen formid aus Formularen WHERE Mieter = @TenantId

Was will ich mit dem Ergebnis dieser Abfrage tun EXEC ist mein Delete_Form Stored Procedure .

Wie kann ich das tun?

+0

Welche RDBMS verwenden Sie? –

+0

Microsoft SQL Server 2008 – Justin

Antwort

6

In dem Fall, in dem Sie keine Kontrolle über die Fremdschlüssel haben und Kaskadenlöschungen nicht durchführen können, könnten Sie einen Cursor erstellen, um durchzulaufen und den gespeicherten proc für jeden auszuführen.

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 perfekt danke! – Justin

2

Sie können Cascade delete nur aktivieren und durch Löschen des übergeordneten Datensatzes werden alle zugehörigen untergeordneten Datensätze gelöscht.

Wenn nicht müssen Sie eine cursor erstellen (Der Link ist für sql Server, aber ich würde annehmen, dass Cursor für andere RDBMS ähnlich sind) und Schleife durch jedes der Ergebnisse ziehen die Formular-ID und Ausführen der [ Delete_Field_Procedure] für jeden.

+0

Danke für Ihre Antwort Kevin. Ich habe das Gefühl, dass bei Cascade zu viel "Magic" passiert, und einige Dinge könnten versehentlich verschwinden. Also ich gehe mit Cursors, die Sie erwähnt haben :) Danke. – Justin

Verwandte Themen