Heim >php教程 >PHP开发 >SQLSERVER-Cursor und Schleifenanweisungen

SQLSERVER-Cursor und Schleifenanweisungen

高洛峰
高洛峰Original
2016-12-14 11:30:461486Durchsuche

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 ] ]


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn