Um es in Bezug auf Cursor zu klären, bietet MSDN Folgendes:
Bestimmte Zeilen über Transact-SQL-Servercursor abrufen.
Parameter
NEXT
Gibt die Ergebniszeile zurück, die unmittelbar auf die aktuelle Zeile folgt, und die aktuelle Zeile wird auf die zurückgegebene Zeile erhöht. Wenn FETCH NEXT der erste Abrufvorgang am Cursor ist, wird die erste Zeile im Ergebnissatz zurückgegeben. NEXT ist die Standardoption zum Extrahieren des Cursors.
PRIOR
Gibt die Ergebniszeile unmittelbar vor der aktuellen Zeile zurück und die aktuelle Zeile wird auf die zurückgegebene Zeile dekrementiert. Wenn FETCH PRIOR der erste Abrufvorgang für den Cursor ist, werden keine Zeilen zurückgegeben und der Cursor wird vor der ersten Zeile platziert.
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 positiv ist, kehre die n-te Zeile vom Cursorkopf zurück und ändere die zurückgegebene Zeile in die neue aktuelle Zeile. Wenn n oder @nvar negativ ist, wird die n-te Zeile vom Ende des Cursors vorwärts zurückgegeben und die zurückgegebene Zeile in die neue aktuelle Zeile umgewandelt. Wenn n oder @nvar 0 ist, werden keine Zeilen zurückgegeben. n muss eine ganzzahlige Konstante sein und der Datentyp von @nvar muss smallint, tinyint oder int sein.
RELATIVE { n |. @nvar}
Wenn n oder @nvar positiv ist, geben Sie die n-te Zeile von der aktuellen Zeile zurück und ändern Sie die zurückgegebene Zeile in die neue aktuelle Zeile. Wenn n oder @nvar negativ ist, wird die n-te Zeile vorwärts von der aktuellen Zeile zurückgegeben und die zurückgegebene Zeile in die neue aktuelle Zeile umgewandelt. Wenn n oder @nvar 0 ist, wird die aktuelle Zeile zurückgegeben. Wenn Sie beim ersten Abruf eines Cursors FETCH RELATIVE angeben und n oder @nvar auf negativ oder 0 gesetzt ist, werden keine Zeilen zurückgegeben. n muss eine ganzzahlige Konstante sein und der Datentyp von @nvar muss smallint, tinyint oder int sein.
GLOBAL
Der angegebene Cursorname bezieht sich auf den globalen Cursor.
Cursorname
Der Name des geöffneten Cursors, aus dem extrahiert werden soll. Wenn sowohl globale als auch lokale Cursor Cursorname als Namen verwenden, bezieht sich Cursorname bei Angabe von GLOBAL auf den globalen Cursor. Wenn GLOBAL nicht angegeben ist, bezieht sich Cursorname auf den lokalen Cursor.
@ Cursor_Variablenname
Cursorvariablenname, der auf den offenen Cursor verweist, aus dem extrahiert werden soll.
INTO @variable_name[ ,...n]
Ermöglicht die Platzierung der Spaltendaten des Extraktionsvorgangs in lokalen Variablen. Jede Variable in der Liste ist von links nach rechts der entsprechenden Spalte im Cursor-Ergebnissatz zugeordnet. Der Datentyp jeder Variablen muss mit dem Datentyp der entsprechenden Ergebnismengenspalte übereinstimmen oder eine implizite Konvertierung sein, die vom Datentyp der Ergebnismengenspalte unterstützt wird. Die Anzahl der Variablen muss mit der Anzahl der Spalten in der Cursorauswahlliste übereinstimmen.
Kommentare
Wenn die SCROLL-Option nicht in einer DECLARE CURSOR-Anweisung im ISO-Stil angegeben ist, ist NEXT die einzige unterstützte FETCH-Option. Alle FETCH-Optionen werden unterstützt, wenn die SCROLL-Option in einer DECLARE CURSOR-Anweisung im ISO-Stil angegeben wird.
Wenn die Transact-SQL DECLARE-Cursorerweiterung verwendet wird, gelten die folgenden Regeln:
NEXT ist die einzige unterstützte FETCH-Option, wenn FORWARD_ONLY oder FAST_FORWARD angegeben ist.
Wenn keine DYNAMIC-, FORWARD_ONLY- oder FAST_FORWARD-Optionen angegeben sind und eine der Optionen KEYSET, STATIC oder SCROLL angegeben ist, werden alle FETCH-Optionen unterstützt.
DYNAMISCHE SCROLL-Cursor unterstützen alle FETCH-Optionen außer ABSOLUTE.
@@FETCH_STATUS-Funktion meldet den Status der vorherigen FETCH-Anweisung. Die gleichen Informationen werden in der Spalte fetch_status im von sp_describe_cursor zurückgegebenen Cursor aufgezeichnet. Diese Statusinformationen sollten verwendet werden, um die Gültigkeit der von einer FETCH-Anweisung zurückgegebenen Daten zu bestimmen, bevor Operationen an den Daten ausgeführt werden. Weitere Informationen finden Sie unter @@FETCH_STATUS (Transact-SQL).
Berechtigungen
FETCH-Berechtigungen werden standardmäßig jedem gültigen Benutzer gewährt.
Beispiel
A. Verwendung von FETCH in einem einfachen Cursor
Das folgende Beispiel deklariert Zeilen, deren Nachname mit dem Buchstaben B in der Person beginnt. Kontakttabelle Erstellen Sie einen einfachen Cursor und verwenden Sie FETCH NEXT, um die Zeilen einzeln abzurufen. Die FETCH-Anweisung gibt die Werte der im DECLARE CURSOR angegebenen Spalten als einzeilige Ergebnismenge 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 zum Speichern von Werten in Variablen
Das folgende Beispiel ähnelt Beispiel A, aber die Ausgabe der FETCH-Anweisung wird stattdessen in einer lokalen Variablen gespeichert direkt an den Kunden zurückgegeben werden. Die PRINT-Anweisung kombiniert Variablen zu einer einzigen Zeichenfolge 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 Sie den SCROLL-Cursor und verwenden Sie andere FETCH-Optionen
以下示例创建一个 SCROLL 游标,使其通过 LAST、PRIOR、RELATIVE 和 ABSOLUTE 选项支持全部滚动功能。
。
另外,再举一个简单的例子:
Declare @Id varchar(20)
Declare @Name varchar(20)
Declare Cur Cursor For
select substring(id,0,7) as id,name from temp1
Open Cur
Fetch next From Cur Into @Id,@Name
While @@fetch_status=0
Begin
Update temp Set [c3]=@Name where [id] like @Id+'%'
Fetch Next From Cur Into @Id,@Name
End
Close Cur
Deallocate Cur
简单的FOR循环等:
declare @i int
set @i=0
while @i<10
begin
set @i = @i+1
end
SQL SERVER不支持FOR循环
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
语法
FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ] FROM ] { { [ GLOBAL ] cursor_name } | @cursor_variable_name } [ INTO @variable_name [ ,...n ] ]