Utilizzare una variabile di tabella o una tabella temporanea.
Come accennato in precedenza, un cursore è l'ultima risorsa. Soprattutto perché utilizza molte risorse, genera blocchi e potrebbe essere un segno che non stai capendo come usare correttamente SQL.
Nota a margine: una volta mi sono imbattuto in una soluzione che utilizzava i cursori per aggiornare le righe in una tabella. Dopo un po 'di controllo, si è scoperto che il tutto poteva essere sostituito con un singolo comando UPDATE. Tuttavia, in questo caso, dove deve essere eseguita una procedura memorizzata, un singolo comando SQL non funzionerà.
Crea una variabile di tabella come questa (se stai lavorando con molti dati o hai poca memoria, usa invece una tabella temporanea ):
DECLARE @menus AS TABLE (
id INT IDENTITY(1,1),
parent NVARCHAR(128),
child NVARCHAR(128));
Il id
è importante.
Sostituire parent
e child
con alcuni dati validi, ad esempio identificatori pertinenti o l'intero insieme di dati su cui operare.
Inserisci i dati nella tabella, ad es .:
INSERT INTO @menus (parent, child)
VALUES ('Some name', 'Child name');
...
INSERT INTO @menus (parent,child)
VALUES ('Some other name', 'Some other child name');
Dichiarare alcune variabili:
DECLARE @id INT = 1;
DECLARE @parentName NVARCHAR(128);
DECLARE @childName NVARCHAR(128);
E infine, crea un ciclo while sui dati nella tabella:
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
La prima selezione recupera i dati dalla tabella temporanea. La seconda selezione aggiorna @id.MIN
restituisce null se non sono state selezionate righe.
Un approccio alternativo è quello di eseguire il ciclo mentre la tabella ha righe SELECT TOP 1
e rimuovere la riga selezionata dalla tabella temporanea:
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;