sql >> Databasteknik >  >> RDS >> Sqlserver

Iterera genom rader i SQL Server 2008

Om du måste iterate(*), använd konstruktionen designad för att göra det - markören . Mycket förtalad, men om det tydligast uttrycker dina avsikter, säger jag använd 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

(*) Det här svaret har fått några omröstningar nyligen, men jag känner att jag borde inkludera min ursprungliga kommentar här också och lägga till några allmänna råd:

I SQL bör du allmänt söka en uppsättningsbaserad lösning. Hela språket är orienterat kring uppsättningsbaserade lösningar, och (i sin tur) optimeraren är orienterat kring att få setbaserade lösningar att fungera bra. I ytterligare sin tur, verktygen som vi har tillgängliga för justering optimeraren är också set-orienterad - t.ex. tillämpa index på tabeller.

Det finns några några situationer där iteration är den bästa metoden. Dessa är få är långt mellan, och kan liknas vid Jacksons regler om optimering - gör det inte - och (endast för experter) gör det inte ännu .

Du är mycket bättre tjent med att först försöka formulera vad du vill när det gäller uppsättningen av alla rader som ska påverkas - vilken är den övergripande förändringen som ska uppnås? - och sedan försöka formulera en fråga som kapslar in det målet. Endast om frågan som skapas genom att göra det inte fungerar tillräckligt (eller om det finns någon annan komponent som inte kan göra något annat än att hantera varje rad individuellt) bör du överväga iteration.



  1. PHP och MySQL:Beställ enligt senaste datum och begränsa 10

  2. Kan inte komma åt någon databas som är root, efter att bara skapat den databasen

  3. DatabaseError:"inte alla argument konverterade under strängformatering" när jag använder pandas.io.sql.to_sql()

  4. Hur man analyserar en VARCHAR som skickas till en lagrad procedur i SQL Server?