Teilen über


FETCH (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

Ruft eine bestimmte Zeile aus einem Transact-SQL-Server-Cursor ab.

Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

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}
Wenn n oder @nvar eine positive Zahl ist, wird die n-te Zeile – ausgehend vom Anfang des Cursors – zurückgegeben. Die zurückgegebene Zeile wird dann zur aktuellen Zeile. Wenn n oder @nvar eine negative Zahl ist, wird die n-te Zeile – ausgehend von der letzten Zeile des Cursors – zurückgegeben. Die zurückgegebene Zeile wird dann zur aktuellen Zeile. Wenn n oder @nvar gleich 0 (null) ist, werden keine Zeilen zurückgegeben. n muss eine Integerkonstante und @nvar muss vom Typ smallint, tinyint oder int sein.

RELATIVE { n| @nvar}
Wenn n oder @nvar eine positive Zahl ist, wird die n-te Zeile nach der aktuellen Zeile zurückgegeben. Die zurückgegebene Zeile wird dann zur aktuellen Zeile. Wenn n oder @nvar eine negative Zahl ist, wird die n-te Zeile vor der aktuellen Zeile zurückgegeben. Die zurückgegebene Zeile wird dann zur aktuellen Zeile. Wenn n oder @nvar gleich 0 ist, wird die aktuelle Zeile zurückgegeben. Wenn beim ersten Datenabruf vom Cursor FETCH RELATIVE auf n oder @nvar auf 0 oder auf eine negative Zahl festgelegt wird, werden keine Zeilen zurückgegeben. n muss eine Integerkonstante und @nvar muss vom Typ 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. Falls sowohl ein lokaler als auch ein globaler Cursor namens cursor_name vorhanden ist, bezieht sich cursor_name nur dann auf den globalen Cursor, wenn GLOBAL angegeben ist. Wird GLOBAL nicht angegeben, 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.

Hinweise

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 Transact-SQL DECLARE Cursor-Erweiterungen verwendet werden, gelten diese Regeln:

  • Wird entweder FORWARD_ONLY oder FAST_FORWARD angegeben, ist NEXT die einzige unterstützte FETCH-Option.

  • Wenn DYNAMIC, FORWARD_ONLY oder FAST_FORWARD nicht angegeben sind und entweder KEYSET, STATIC oder SCROLL angegeben wird, 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).

Berechtigungen

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

Beispiele

A. Verwenden von FETCH in einem einfachen Cursor

Im folgenden Beispiel wird ein einfacher Cursor für die Zeilen in der Person.Person-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 AdventureWorks2022;  
GO  
DECLARE contact_cursor CURSOR FOR  
SELECT LastName FROM Person.Person  
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 AdventureWorks2022;  
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.Person  
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 Durchführen eines Bildlaufs mit den Optionen LAST, PRIOR, RELATIVE und ABSOLUTE genutzt werden können.

USE AdventureWorks2022;  
GO  
-- Execute the SELECT statement alone to show the   
-- full result set that is used by the cursor.  
SELECT LastName, FirstName FROM Person.Person  
ORDER BY LastName, FirstName;  
  
-- Declare the cursor.  
DECLARE contact_cursor SCROLL CURSOR FOR  
SELECT LastName, FirstName FROM Person.Person  
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  

Weitere Informationen

CLOSE (Transact-SQL)
DEALLOCATE (Transact-SQL)
DECLARE CURSOR (Transact-SQL)
OPEN (Transact-SQL)