Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Scorrere le righe in SQL Server 2008

Se devi iterare(*), utilizzare il costrutto progettato per farlo:il cursore . Molto diffamato, ma se esprime più chiaramente le tue intenzioni, dico di usarlo:

DECLARE @ID int
DECLARE IDs CURSOR LOCAL FOR select ID from SAMPLE where Name = @NameParameter

OPEN IDs
FETCH NEXT FROM IDs into @ID
WHILE @@FETCH_STATUS = 0
BEGIN
    exec myproc @ID

    FETCH NEXT FROM IDs into @ID
END

CLOSE IDs
DEALLOCATE IDs

(*) Questa risposta ha ricevuto alcuni voti positivi di recente, ma sento che dovrei incorporare anche il mio commento originale qui e aggiungere alcuni consigli generali:

In SQL dovresti generalmente cercare una soluzione basata sugli insiemi. L'intero linguaggio è orientato a soluzioni basate su set e (a sua volta) l'ottimizzatore è orientato a far funzionare bene le soluzioni basate su set. A loro volta, gli strumenti che abbiamo a disposizione per la ottimizzazione anche l'ottimizzatore è orientato al set, ad es. applicare gli indici alle tabelle.

Ce ne sono pochi situazioni in cui l'iterazione è l'approccio migliore. Questi sono pochi sono lontani tra loro e possono essere paragonati alle regole di Jackson sull'ottimizzazione - non farlo - e (solo per esperti) non farlo ancora .

È molto meglio che tu provi prima a formulare ciò che desideri in termini di set di tutte le righe da influenzare:qual è il cambiamento complessivo da ottenere? - e quindi provare a formulare una query che incapsula quell'obiettivo. Solo se la query prodotta in questo modo non funziona in modo adeguato (o c'è qualche altro componente che non è in grado di fare altro che gestire ogni riga individualmente) dovresti considerare iterazione.