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

Gentag gennem rækker i SQL Server 2008

Hvis du skal iterate(*), brug konstruktionen designet til at gøre det - markøren . Meget udskældt, men hvis det tydeligst udtrykker dine hensigter, siger jeg brug det:

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

(*) Dette svar har modtaget et par opstemmer for nylig, men jeg føler, at jeg også burde inkorporere min oprindelige kommentar her og tilføje nogle generelle råd:

I SQL bør du generelt søge en sæt-baseret løsning. Hele sproget er orienteret omkring sæt-baserede løsninger, og (til gengæld) er optimizeren orienteret omkring at få sæt-baserede løsninger til at fungere godt. Til gengæld de værktøjer, vi har til rådighed til tuning optimizeren er også sæt-orienteret - f.eks. anvendelse af indekser på tabeller.

Der er nogle situationer, hvor iteration er den bedste tilgang. Disse er få er langt imellem, og kan sammenlignes med Jacksons regler om optimering - gør det ikke - og (kun for eksperter) gør det ikke endnu .

Du er langt bedre tjent med først at prøve at formulere, hvad du ønsker i forhold til det sæt af alle rækker, der skal påvirkes - hvad er den overordnede ændring, der skal opnås? - og prøv så at formulere en forespørgsel, der indkapsler det mål. Kun hvis forespørgslen, der er fremstillet ved at gøre det, ikke fungerer tilstrækkeligt (eller der er en anden komponent, der ikke er i stand til at gøre andet end at håndtere hver række individuelt), bør du overveje iteration.



  1. Mysql Indsæt ordrenummer efter VARCHAR-felt

  2. Oprettelse af grupper af på hinanden følgende dage, der opfylder et givet kriterium

  3. Udførelsesplanens indvirkning på ASYNC_NETWORK_IO Venter – Del 1

  4. Annoncering af repmgr 2.0RC2