sql >> Database >  >> RDS >> Sqlserver

Door rijen doorlopen in SQL Server 2008

Als je moet iterate(*), gebruik de constructie die hiervoor is ontworpen - de cursor . Veel verguisd, maar als het je bedoelingen het duidelijkst uitdrukt, zou ik zeggen:gebruik het:

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

(*) Dit antwoord heeft onlangs een paar positieve stemmen gekregen, maar ik vind dat ik mijn oorspronkelijke opmerking hier ook moet opnemen en wat algemeen advies moet toevoegen:

In SQL moet u in het algemeen zoeken naar een set-based oplossing. De hele taal is gericht op set-gebaseerde oplossingen en (op zijn beurt) de optimizer is gericht op het goed laten werken van set-gebaseerde oplossingen. Op zijn beurt zijn de tools die we beschikbaar hebben voor tuning de optimizer is ook set-georiënteerd - b.v. indexen toepassen op tabellen.

Er zijn een paar situaties waarin iteratie de beste aanpak is. Dit zijn er maar weinig tussenin, en kunnen worden vergeleken met Jackson's regels voor optimalisatie - doe het niet - en (alleen voor experts) doe het nog .

Het is veel beter om eerst te proberen te formuleren wat je wilt in termen van de reeks van alle rijen die moeten worden beïnvloed - wat is de algehele verandering die moet worden bereikt? - en probeer vervolgens een query te formuleren die dat doel omvat. Alleen als de query die hierdoor wordt geproduceerd niet goed presteert (of als er een ander onderdeel is dat niet in staat is om iets anders te doen dan elke rij afzonderlijk af te handelen), moet u overweeg iteratie.



  1. SQL Server voorwaardelijke bestelling op

  2. Docker-container wordt afgesloten met de foutmelding 'gegevensmap heeft verkeerd eigendom' wanneer uitgevoerd in Windows 10

  3. Splits meerdere SQL-instructies in afzonderlijke SQL-instructies

  4. Hoe bulksgewijs invoegen vanuit de XLSX-bestandsextensie?