Verwenden Sie eine Tabellenvariable oder eine temporäre Tabelle.
Wie bereits erwähnt, ist ein Cursor das letzte Mittel. Meistens, weil es viele Ressourcen verwendet, Sperren ausgibt und möglicherweise ein Zeichen dafür ist, dass Sie nicht verstehen, wie SQL richtig verwendet wird.
Randnotiz: Ich bin einmal auf eine Lösung gestoßen, bei der Cursor zum Aktualisieren von Zeilen in einer Tabelle verwendet wurden. Nach einiger Prüfung stellte sich heraus, dass das Ganze durch einen einzigen UPDATE-Befehl ersetzt werden konnte. In diesem Fall, in dem eine gespeicherte Prozedur ausgeführt werden soll, funktioniert ein einzelner SQL-Befehl jedoch nicht.
Erstellen Sie eine Tabellenvariable wie diese (wenn Sie mit vielen Daten arbeiten oder wenig Speicher haben, verwenden Sie stattdessen eine temporäre Tabelle ):
DECLARE @menus AS TABLE (
id INT IDENTITY(1,1),
parent NVARCHAR(128),
child NVARCHAR(128));
Das id
ist wichtig.
Ersetzen Sie parent
und child
mit einigen guten Daten, z. B. relevanten Kennungen oder dem gesamten Datensatz, mit dem gearbeitet werden soll.
Fügen Sie Daten in die Tabelle ein, z.
INSERT INTO @menus (parent, child)
VALUES ('Some name', 'Child name');
...
INSERT INTO @menus (parent,child)
VALUES ('Some other name', 'Some other child name');
Deklarieren Sie einige Variablen:
DECLARE @id INT = 1;
DECLARE @parentName NVARCHAR(128);
DECLARE @childName NVARCHAR(128);
Erstellen Sie abschließend eine while-Schleife über die Daten in der Tabelle:
WHILE @id IS NOT NULL
BEGIN
SELECT @parentName = parent,
@childName = child
FROM @menus WHERE id = @id;
EXEC myProcedure @parent=@parentName, @child=@childName;
SELECT @id = MIN(id) FROM @menus WHERE id > @id;
END
Die erste Auswahl ruft Daten aus der temporären Tabelle ab. Die zweite Auswahl aktualisiert die @id. MIN
Gibt null zurück, wenn keine Zeilen ausgewählt wurden.
Ein alternativer Ansatz besteht darin, eine Schleife zu erstellen, während die Tabelle Zeilen enthält, SELECT TOP 1
und die ausgewählte Zeile aus der temporären Tabelle zu entfernen:
WHILE EXISTS(SELECT 1 FROM @menuIDs)
BEGIN
SELECT TOP 1 @menuID = menuID FROM @menuIDs;
EXEC myProcedure @menuID=@menuID;
DELETE FROM @menuIDs WHERE menuID = @menuID;
END;