Normalmente sono da evitare, ma la funzione c'è per un motivo e ci sono momenti per usarli. Direi che oltre il 90% dei cursori che ho visto non sono necessari. Se li stai usando per operazioni CRUD, questo può quasi sempre essere rifatto in modo basato su set. Ho visto spesso persone usare i cursori per questo perché non sanno come usare i join in un aggiornamento o un'eliminazione o perché possono usare un'istruzione select invece di una clausola di valori in un inserto. Un altro uso non necessario quando le persone pensano di averne bisogno per un'elaborazione leggermente più complessa che in realtà potrebbe essere facilmente gestita con una dichiarazione del caso.
I cursori a volte sono più veloci per calcolare qualcosa come un totale parziale.
I cursori sono utili anche per più esecuzioni di un processo memorizzato impostato per gestire un solo valore di input alla volta. Non utilizzo questa funzione per eseguire proc archiviati dall'utente (a meno che non so che raggiungerò un set di dati molto piccolo), ma è molto utile per gli amministratori di database quando devono eseguire proc di sistema su più tabelle.
Se stai creando email in SQl (non è il posto migliore per farlo, ma in alcuni sistemi è lì che lo fanno) e non vuoi che l'intero pubblico dell'email veda le altre persone nell'elenco o desideri personalizzarle email con informazioni sul destinatario, i cursori sono la strada da percorrere.
I cursori o i loop possono essere utilizzati anche per elaborare batch di record se l'intero inserimento/aggiornamento/eliminazione basato su set richiederà troppo tempo e bloccherà le tabelle. Si tratta di una sorta di ibrido tra i cursori e la soluzione set-based ed è spesso la migliore per grandi cambiamenti sui sistemi di produzione.