FETCH (Transact-SQL)

Ruft eine bestimmte Zeile aus einem Transact-SQL-Servercursor ab.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen


FETCH 
          [ [ NEXT | PRIOR | FIRST | LAST 
                    | ABSOLUTE { n | @nvar } 
                    | RELATIVE { n | @nvar } 
               ] 
               FROM 
          ] 
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name } 
[ INTO @variable_name [ ,...n ] ] 

NEXT

Gibt die auf die aktuelle Zeile folgende Zeile zurück und macht diese zur aktuellen Zeile. Ist FETCH NEXT der erste Datenabruf vom Cursor, wird die erste Zeile im Resultset zurückgegeben. NEXT ist die Standardoption für Datenabruf vom Cursor.

PRIOR

Gibt die der aktuellen Zeile vorangehende Zeile zurück und macht diese zur aktuellen Zeile. Ist FETCH PRIOR der erste Datenabruf vom Cursor, wird keine Zeile zurückgegeben, und die Cursorposition verbleibt vor der ersten Zeile.

FIRST

Gibt die erste Zeile im Cursor zurück und macht sie zur aktuellen Zeile.

LAST

Gibt die letzte Zeile im Cursor zurück und macht sie zur aktuellen Zeile.

ABSOLUTE { n| @nvar}

Falls n bzw. @nvar eine positive Zahl ist, wird die n-te Zeile – ausgehend vom Anfang des Cursors – zurückgegeben. Die zurückgegebene Zeile wird zur aktuellen Zeile. Falls n bzw. @nvar eine negative Zahl ist, wird die n-te Zeile – ausgehend von der letzten Zeile des Cursors – zurückgegeben. Die zurückgegebene Zeile wird zur aktuellen Zeile. Wenn n oder @nvar gleich 0 ist, werden keine Zeilen zurückgegeben. n muss eine ganzzahlige Konstante sein, und @nvar muss smallint, tinyint oder int sein.

RELATIVE { n| @nvar}

Falls n bzw. @nvar eine positive Zahl ist, wird die n-te Zeile nach der aktuellen Zeile zurückgegeben. Die zurückgegebene Zeile wird zur aktuellen Zeile. Falls n bzw. @nvar eine negative Zahl ist, wird die n-te Zeile vor der aktuellen Zeile zurückgegeben. Die zurückgegebene Zeile wird zur aktuellen Zeile. Ist n bzw. @nvar gleich 0, wird die aktuelle Zeile zurückgegeben. Ist beim ersten Datenabruf vom Cursor FETCH RELATIVE auf n bzw. @nvar auf 0 oder auf eine negative Zahl festgelegt, werden keine Zeilen zurückgegeben. n muss eine ganzzahlige Konstante und @nvar muss smallint, tinyint oder int sein.

GLOBAL

Gibt an, dass cursor_name auf einen globalen Cursor verweist.

cursor_name

Der Name des geöffneten Cursors, von dem der Abruf erfolgen soll. Wenn sowohl ein globaler als auch ein lokaler Cursor mit dem Namen cursor_name vorhanden sind, bezieht sich cursor_name auf den globalen Cursor, wenn GLOBAL angegeben ist. Andernfalls bezieht es sich auf den lokalen Cursor.

@ cursor_variable_name

Der Name einer Cursorvariablen, die sich auf den geöffneten Cursor bezieht, von dem der Abruf erfolgen soll.

INTO @variable_name[ ,...n]

Ermöglicht die Zuweisung von Daten aus den Spalten, die durch einen Abruf zurückgegeben werden, an lokale Variablen. Jeder Variablen in der Liste wird (von links nach rechts) die entsprechende Spalte im Cursorresultset zugeordnet. Die Datentypen aller Variablen müssen mit dem Datentyp der entsprechenden Resultsetspalte übereinstimmen oder implizit in diesen Datentyp konvertiert werden können. Die Anzahl von Variablen muss mit der Anzahl von Spalten in der SELECT-Liste des Cursors übereinstimmen.

Wird SCROLL in der ISO-Anweisung DECLARE CURSOR nicht angegeben, wird lediglich die FETCH-Option NEXT unterstützt. Wird SCROLL in der ISO-Anweisung DECLARE CURSOR angegeben, werden alle FETCH-Optionen unterstützt.

Wenn die DECLARE CURSOR-Erweiterungen von Transact-SQL verwendet werden, gelten folgende Regeln:

  • Falls entweder FORWARD_ONLY oder FAST_FORWARD angegeben wird, wird lediglich die FETCH-Option NEXT unterstützt.

  • Wenn keine der Optionen DYNAMIC, FORWARD_ONLY oder FAST_FORWARD, aber eine der Optionen KEYSET, STATIC oder SCROLL angegeben ist, werden alle FETCH-Optionen unterstützt.

  • DYNAMIC SCROLL-Cursor unterstützen alle FETCH-Optionen außer ABSOLUTE.

Die @@FETCH_STATUS-Funktion meldet den Status der letzten FETCH-Anweisung. Die gleichen Informationen werden in der fetch_status-Spalte des Cursors gespeichert, der von sp_describe_cursor zurückgegeben wird. Mit diesen Statusinformationen kann die Gültigkeit von Daten einer vorangehenden FETCH-Anweisung überprüft werden, bevor diese Daten weiterverarbeitet werden. Weitere Informationen finden Sie unter @@FETCH_STATUS (Transact-SQL).

FETCH-Berechtigungen erhalten standardmäßig alle gültigen Benutzer.

A. Verwenden von FETCH in einem einfachen Cursor

Im folgenden Beispiel wird ein einfacher Cursor für die Zeilen in der Person.Contact-Tabelle deklariert, die einen Nachnamen enthalten, der mit B beginnt. Mit FETCH NEXT wird Zeile für Zeile eingelesen. Die FETCH-Anweisungen geben den Wert für die in DECLARE CURSOR angegebene Spalte als einzeiliges Resultset zurück.

USE AdventureWorks
GO
DECLARE contact_cursor CURSOR FOR
SELECT LastName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName

OPEN contact_cursor

-- Perform the first fetch.
FETCH NEXT FROM contact_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

B. Verwenden von FETCH, um Werte in Variablen zu speichern

Das folgende Beispiel ähnelt Beispiel A. Allerdings wird hier die Ausgabe der FETCH-Anweisungen in lokalen Variablen gespeichert und nicht direkt an den Client zurückgegeben. Die PRINT-Anweisung fasst die Variablen zu einer einzelnen Zeichenfolge zusammen und gibt sie an den Client zurück.

USE AdventureWorks
GO
-- Declare the variables to store the values returned by FETCH.
DECLARE @LastName varchar(50), @FirstName varchar(50)

DECLARE contact_cursor CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Perform the first fetch and store the values in variables.
-- Note: The variables are in the same order as the columns
-- in the SELECT statement. 

FETCH NEXT FROM contact_cursor
INTO @LastName, @FirstName

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN

   -- Concatenate and display the current values in the variables.
   PRINT 'Contact Name: ' + @FirstName + ' ' +  @LastName

   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
   INTO @LastName, @FirstName
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

C. Deklarieren eines SCROLL-Cursors und Verwenden der übrigen FETCH-Optionen

Im folgenden Beispiel wird ein SCROLL-Cursor erstellt, damit alle Möglichkeiten für das Scrollen mit den Optionen LAST, PRIOR, RELATIVE und ABSOLUTE genutzt werden können.

USE AdventureWorks
GO
-- Execute the SELECT statement alone to show the 
-- full result set that is used by the cursor.
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

-- Declare the cursor.
DECLARE contact_cursor SCROLL CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Fetch the last row in the cursor.
FETCH LAST FROM contact_cursor

-- Fetch the row immediately prior to the current row in the cursor.
FETCH PRIOR FROM contact_cursor

-- Fetch the second row in the cursor.
FETCH ABSOLUTE 2 FROM contact_cursor

-- Fetch the row that is three rows after the current row.
FETCH RELATIVE 3 FROM contact_cursor

-- Fetch the row that is two rows prior to the current row.
FETCH RELATIVE -2 FROM contact_cursor

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

Community-Beiträge

HINZUFÜGEN
Anzeigen: