Gewusst wie: Verwenden von geschachtelten Cursorn

November 25

Gewusst wie: Verwenden von geschachtelten Cursorn

Cursor sind eine Struktur in programmierbare Versionen von SQL Structured Query Language () wie Sybase oder Microsoft SQL Server Transact-SQL zur Verfügung gestellt. Definieren Sie einen Cursor für eine SQL-Anweisung Select oder Update auf eine oder mehrere Tabellen. Der Cursor hat einen Namen, den Sie verwenden können, um, öffnen und Schließen der Cursor oder Fetch Zeilen aus dem Cursor verweisen festgelegt. Cursor werden verwendet, wenn jede Zeile in der Gruppe Verarbeitung benötigt oder ihre Werte sind in Programmvariablen verwendet. Wenn ein neuer Cursor in der Schleife, die jede Zeile eines Cursors verarbeitet deklariert wird, ist der neue innere Cursor in der alten äußeren Cursor geschachtelt.

Anweisungen

1 Deklarieren Sie einen Cursor für eine einfache select-Anweisung verwendet die folgende T-SQL-Syntax:

DECLARE Cursor < Name > CURSOR

FÜR SELECT Feld1, Feld2, Feld3

FROM &lt;table-name>

WHERE field4 &lt;= @limitval2

Öffnen Sie den Cursor zur Verarbeitung mit diesem T-SQL-Syntax:

OPEN < Cursorname >

3 Rufen Sie Zeilen aus der geöffneten Cursor zur Verarbeitung, da es ein lesen (auswählen)-Cursor ist. Deklarieren Sie Variablen benötigt, um die Werte der Felder in die aktuelle Zeile des Cursors zu speichern. Die T-SQL-Syntax um Cursor Zeilen abzurufen, ist wie folgt:

FETCH NEXT FROM < Cursorname > in @var_fld1, @var_fld2, @var_fld3

zwar @@fetch_status == 0

beginnen

---< Prozess aktuelle Cursorzeile hier >

FETCH NEXT FROM < Cursorname > in @var_fld1, @var_fld2, @var_fld3

Ende

4 Fügen Sie die Deklaration und die Ausführung der zweiten oder innere Cursor in der Schleife holen vom vorherigen oder äußeren Cursor wie folgt:

--äußere Cursor Abrufoperation Schleife

zwar @@fetch_status == 0

beginnen

&lt; process current row of outer cursor here >

-- Time to declare the inner cursor - nesting begins

Inner_cursor CURSOR deklarieren

WÄHLEN SIE X, Y, Z...

AUS Tabelle1, Tabelle2,...

WO < Bedingung >

OFFENE inner_cursor

FETCH NEXT FROM Inner_cursor in @varX, @varY, @varZ...

zwar @@fetch_status == 0

BEGIN--innere Cursor Abrufoperation Schleife

-- &lt;process current inner_cursor row here>

-- get next row

FETCH NEXT FROM inner_cursor INTO @varX, @varY, @varZ...

Ende--innere Cursor Abrufoperation Schleife

Ende--äußeren Cursor Abrufoperation Schleife

Tipps & Warnungen

  • Es wird empfohlen, geschachtelte Cursor nur, wenn es absolut notwendig implementieren. Sind sie dynamisches SQL und teuer und Besteuerung für den SQL-Server verarbeiten. Vermeiden Sie zu viele temporäre Tabellen oder insert-Anweisungen beim Verwenden von geschachtelter Cursors. Verwenden Sie Funktionen und speichert Verfahren, um Parameter übergeben und Freigeben von Daten, wenn möglich, die Notwendigkeit der Cursor zu beseitigen.