OPEN (Transact-SQL)

Öffnet einen Transact-SQL-Servercursor und füllt den Cursor auf, indem die Transact-SQL-Anweisung ausgeführt wird, die in der cursor_variable-Anweisung für DECLARE CURSOR oder SET angegeben ist.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }

Argumente

  • GLOBAL
    Gibt an, dass cursor_name auf einen globalen Cursor verweist.

  • cursor_name
    Der Name eines deklarierten Cursors. 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 sich cursor_name auf den lokalen Cursor.

  • cursor_variable_name
    Der Name einer Cursorvariablen, die auf einen Cursor verweist.

Hinweise

Falls der Cursor mit der Option INSENSITIVE oder STATIC deklariert wird, erstellt OPEN eine temporäre Tabelle für das Resultset. OPEN schlägt fehl, wenn die Größe einer Zeile im Resultset die Maximalgröße für SQL Server-Tabellen überschreitet. Falls der Cursor mit der Option KEYSET deklariert wird, erstellt OPEN eine temporäre Tabelle für das Keyset. Die temporären Tabellen werden in tempdb gespeichert.

Nachdem ein Cursor geöffnet wurde, kann mit der @@CURSOR_ROWS-Funktion die Anzahl der Zeilen im letzten geöffneten Cursor abgerufen werden, die der Bedingung entsprechen.

HinweisHinweis

In SQL Server wird das asynchrone Generieren von keysetgesteuerten oder statischen Transact-SQL-Cursorn nicht unterstützt. Transact-SQL-Cursorvorgänge, wie z. B. OPEN oder FETCH, sind in Batches enthalten. Daher ist das asynchrone Generieren von Transact-SQL-Cursorn nicht erforderlich. In SQL Server werden weiterhin asynchrone keysetgesteuerte oder statische API-(Application Programming Interface-)Servercursor unterstützt, wobei OPEN mit geringer Latenzzeit ein Problem darstellt. Dies ist auf Clientroundtrips zurückzuführen, die für jeden Cursorvorgang ausgeführt werden.

Beispiele

Im folgenden Beispiel wird ein Cursor geöffnet, und es werden alle Zeilen abgerufen.

DECLARE Employee_Cursor CURSOR FOR
SELECT LastName, FirstName
FROM AdventureWorks2008R2.HumanResources.vEmployee
WHERE LastName like 'B%';

OPEN Employee_Cursor;

FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM Employee_Cursor
END;

CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;