Siccome uso spesso i cursori, ma non ricordo mai esattamente tutti i passaggi – ogni volta devo guardare qualche procedura che ho fatto tempo addietro – riporto qui tutti gli ingredienti e il codice completo.
DECLARE db_cursor CURSOR FOR
SELECT name
FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')
Per prima cosa devo dichiarare il cursore, e contestualmente lo devo associare a una query che restituisce un certo numero di campi.
OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name
Apro il cursore e infilo i campi che ho estratto dalla query in variabili dello stesso tipo (devo averle già dichiarate sopra)
WHILE @@FETCH_STATUS = 0 BEGIN
@@FETCH_STATUS è uguale a zero finché ci sono righe nel risultato della query, poi diventa 1 e quindi il ciclo WHILE termina
SET @fileName = @path + @name + '.BAK' BACKUP DATABASE @name TO DISK = @fileName
Faccio qualcosa (in questo caso il backup di un database, devo aver già dichiarato le variabili @fileName e @path)
FETCH NEXT FROM db_cursor INTO @name END
continuo a leggere righe e infilare i campi estratti in singole variabili
CLOSE db_cursor DEALLOCATE db_cursor
non c’è “garbage collection”: quando finisce il ciclo il cursore resta aperto e allocato, a meno che non lo chiuda.
E ora…
Il codice completo per usare un cursore
DECLARE db_cursor CURSOR FOR
SELECT name
FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '.BAK'
BACKUP DATABASE @name TO DISK = @fileName
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor