Sintassi per usare un cursore

0
(0)

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

Hai trovato utile questo contenuto?

Valutazione: 0 / 5. Voti: 0

Vota per primo questo contenuto

Ci dispiace che tu abbia trovato inutile o sbagliato questo contenuto

Lasciaci un messaggio

Come possiamo migliorare?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Moderazione dei commenti attiva. Il tuo commento non apparirà immediatamente.