Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Zeilen in SQL Server 2008 durchlaufen

Wenn Sie müssen iterate(*), verwenden Sie das dafür vorgesehene Konstrukt - den Cursor . Viel verleumdet, aber wenn es Ihre Absichten am deutlichsten ausdrückt, sage ich, verwenden Sie es:

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

(*) Diese Antwort hat in letzter Zeit einige Upvotes erhalten, aber ich denke, ich sollte meinen ursprünglichen Kommentar auch hier einfügen und einige allgemeine Ratschläge hinzufügen:

In SQL sollten Sie allgemein Suche nach einer mengenbasierten Lösung. Die gesamte Sprache ist auf mengenbasierte Lösungen ausgerichtet, und (wiederum) ist der Optimierer darauf ausgerichtet, dass mengenbasierte Lösungen gut funktionieren. Im weiteren wiederum die Werkzeuge, die uns zum Tuning zur Verfügung stehen der Optimierer ist auch mengenorientiert - z.B. Anwenden von Indizes auf Tabellen.

Es gibt ein paar einige Situationen, in denen Iteration der beste Ansatz ist. Dies sind nur wenige, die weit voneinander entfernt sind und mit Jacksons Regeln zur Optimierung verglichen werden können – tu es nicht – und (nur für Experten) tu es noch nicht .

Sie sind viel besser bedient, wenn Sie zuerst versuchen zu formulieren, was Sie in Bezug auf die Menge aller betroffenen Zeilen wollen - was ist die zu erreichende Gesamtänderung? - und versuchen Sie dann, eine Abfrage zu formulieren, die dieses Ziel einschließt. Nur wenn die dadurch erzeugte Abfrage nicht angemessen funktioniert (oder es eine andere Komponente gibt, die nicht in der Lage ist, etwas anderes zu tun, als jede Zeile einzeln zu behandeln), sollten Sie dies überdenken Iteration.