La gestione dei cursori in SQL Server permette di ciclare un recordset per effettuare le più svariate operazioni.
Uno script template di esempio per la gestione dei cursori in SQL Server.
DECLARE @miavar1 varchar(40), @miavar2 varchar(20) DECLARE miocursore CURSOR FOR SELECT campo1, campo2 FROM tabella -- eventuali join, clausole where e ordinamento OPEN miocursore FETCH NEXT FROM miocursore INTO @miavar1, @miavar1 WHILE @@FETCH_STATUS = 0 BEGIN PRINT "campo1= " + @miavar1 + ", campo2= " + @miavar2 FETCH NEXT FROM miocursore INTO @miavar1, @miavar2 END CLOSE miocursore DEALLOCATE miocursore GO
In questo esempio abbiamo una tabella che si chiama appunto tabella,
con due campi: campo1 e campo2 rispettivamente varchar di 40 e 20.
Inizialmente vengono dichiarate le due variabili (miavar1 e miavar2) destinate a contenere i campi
della tabella che dobbiamo scorrere e definiamo il cursore.
La prima fetch inserisce il valore dei campi del primo record nelle variabili.
@@FETCH STATUS ci indica se abbiamo raggiunto o meno la fine del cursore, nell'esempio
vengono stampati i valori delle due variabili ma è solo un esempio, giusto per dire che
è possibile creare un qualsiasi numero di variabili (L'importante è che siano dello stesso
tipo di dati dei campi che devono contenere) e fare qualsiasi operazione.
Se possibile, evitare di utilizzare i cursori in SQL Server perchè generalmente utilizzano molte risorse e riducono le prestazioni e la scalabilità delle applicazioni.
Se proprio si deve ciclare un recordset, assicurarsi prima di poter utilizzare qualche un altro metodo per effettuare l'operazione. Alcune alternative sono:
Spesso queste tecniche possono effettuare le stesse mansioni dei cursori. Se proprio si rende necessario l'utilizzo dei cursori bisogna ridurre al minimo il numero di record da processare. Un modo di fare ciò è creare prima una tabella temporanea per poi richiamare il cursore su questa tabella.
E' sempre preferibili il moetodo della tabella temporanea in quanto non vengono bloccate le tabelle a cui farebbe riferimento la query di inizializzazione del cursore.
Dopo aver utilizzato il cursore non basta chiuderlo con l'istruzione
CLOSE miocursore
ma è necessario anche il comando
DEALLOCATE miocursore
Questa istriuzione libera le risorse utilizzate da SQL Server che altrimenti rimarranno assegnate al cursore per nuove implementazioni e non riutilizzabili per altri scopi, degradando le prestazioni del server.