DECLARE CURSOR (Transact-SQL)DECLARE CURSOR (Transact-SQL)

GILT FÜR: jaSQL Server (ab 2008) jaAzure SQL-DatenbankjaAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Definiert die Attribute eines Transact-SQLTransact-SQL-Servercursors, wie z. B. dessen Scrollverhalten, sowie die Abfrage, die zum Erstellen des Resultsets verwendet wird, auf das der Cursor ausgeführt wird.Defines the attributes of a Transact-SQLTransact-SQL server cursor, such as its scrolling behavior and the query used to build the result set on which the cursor operates. DECLARE CURSOR unterstützt sowohl die Syntax basierend auf dem ISO-Standard als auch eine Syntax, für die eine Teilmenge der Transact-SQLTransact-SQL-Erweiterungen verwendet wird.DECLARE CURSOR accepts both a syntax based on the ISO standard and a syntax using a set of Transact-SQLTransact-SQL extensions.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

ISO Syntax  
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR   
     FOR select_statement   
     [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]  
[;]  
Transact-SQL Extended Syntax  
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]   
     [ FORWARD_ONLY | SCROLL ]   
     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]   
     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]   
     [ TYPE_WARNING ]   
     FOR select_statement   
     [ FOR UPDATE [ OF column_name [ ,...n ] ] ]  
[;]  

ArgumenteArguments

cursor_namecursor_name
Der Name des definierten Servercursors von Transact-SQLTransact-SQL.Is the name of the Transact-SQLTransact-SQL server cursor defined. cursor_name muss den Regeln für Bezeichner entsprechen.cursor_name must conform to the rules for identifiers.

INSENSITIVEINSENSITIVE
Definiert einen Cursor, der eine temporäre Kopie der von ihm zu verwendenden Daten erzeugt.Defines a cursor that makes a temporary copy of the data to be used by the cursor. Sämtliche Anforderungen an den Cursor werden von dieser temporären Tabelle in tempdb beantwortet; Änderungen an den Basistabellen werden nicht in den Daten wiedergegeben, die durch Abrufvorgänge an diesen Cursor zurückgegeben wurden. Darüber hinaus lässt dieser Cursor keine Änderungen zu.All requests to the cursor are answered from this temporary table in tempdb; therefore, modifications made to base tables are not reflected in the data returned by fetches made to this cursor, and this cursor does not allow modifications. Bei Verwendung der ISO-Syntax ohne INSENSITIVE werden ausgeführte Löschvorgänge und Updates an den zugrunde liegenden Tabellen (von einem beliebigen Benutzer) in späteren Abrufvorgängen wiedergegeben.When ISO syntax is used, if INSENSITIVE is omitted, committed deletes and updates made to the underlying tables (by any user) are reflected in subsequent fetches.

SCROLLSCROLL
Gibt an, dass alle Abrufoptionen (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) zur Verfügung stehen.Specifies that all fetch options (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) are available. Wird SCROLL in einer ISO-Anweisung des Typs DECLARE CURSOR nicht angegeben, wird nur die Abrufoption NEXT unterstützt.If SCROLL is not specified in an ISO DECLARE CURSOR, NEXT is the only fetch option supported. SCROLL kann nicht angegeben werden, wenn FAST_FORWARD ebenfalls angegeben ist.SCROLL cannot be specified if FAST_FORWARD is also specified. Wenn SCROLL nicht angegeben wird, ist nur die Abrufoption NEXT verfügbar, und der Cursor wird ein FORWARD_ONLY-Cursor.If SCROLL is not specified then only the fetch option NEXT is available and the cursor becomes FORWARD_ONLY.

select_statementselect_statement
Eine standardmäßige SELECT-Anweisung, die das Resultset des Cursors definiert.Is a standard SELECT statement that defines the result set of the cursor. Die Schlüsselwörter FOR BROWSE und INTO sind in select_statement einer Cursordeklaration nicht zulässig.The keywords FOR BROWSE, and INTO are not allowed within select_statement of a cursor declaration.

SQL ServerSQL Server konvertiert den Cursor implizit in einen anderen Typ, wenn die Klauseln in select_statement in Konflikt mit der Funktionalität des angeforderten Cursortyps stehen.implicitly converts the cursor to another type if clauses in select_statement conflict with the functionality of the requested cursor type.

READ ONLYREAD ONLY
Verhindert, dass über diesen Cursor Updates vorgenommen werden.Prevents updates made through this cursor. Auf den Cursor kann in einer UPDATE- oder DELETE-Anweisung nicht in einer WHERE CURRENT OF-Klausel verwiesen werden.The cursor cannot be referenced in a WHERE CURRENT OF clause in an UPDATE or DELETE statement. Diese Option überschreibt die Standardeinstellung, nach der ein Cursor aktualisiert werden kann.This option overrides the default capability of a cursor to be updated.

UPDATE [OF column_name [ , ...n]]UPDATE [OF column_name [,...n]]
Definiert aktualisierbare Spalten innerhalb des Cursors.Defines updatable columns within the cursor. Wenn OF <column_name> [, <... n>] angegeben wird, können nur in den aufgeführten Spalten Änderungen vorgenommen werden.If OF <column_name> [, <... n>] is specified, only the columns listed allow modifications. Wenn UPDATE ohne Spaltenliste angegeben wird, können alle Spalten aktualisiert werden.If UPDATE is specified without a column list, all columns can be updated.

cursor_namecursor_name
Der Name des definierten Servercursors von Transact-SQLTransact-SQL.Is the name of the Transact-SQLTransact-SQL server cursor defined. cursor_name muss den Regeln für Bezeichner entsprechen.cursor_name must conform to the rules for identifiers.

LOCALLOCAL
Gibt an, dass der Gültigkeitsbereich des Cursors lokal zu dem Batch, der gespeicherten Prozedur oder dem Trigger ist, in dem bzw. in der er erstellt wurde.Specifies that the scope of the cursor is local to the batch, stored procedure, or trigger in which the cursor was created. Der Cursorname ist nur innerhalb dieses Bereichs gültig.The cursor name is only valid within this scope. Auf den Cursor kann durch lokale Cursorvariablen im Batch, in der gespeicherten Prozedur, im Trigger oder im OUTPUT-Parameter einer gespeicherten Prozedur verwiesen werden.The cursor can be referenced by local cursor variables in the batch, stored procedure, or trigger, or a stored procedure OUTPUT parameter. Ein OUTPUT-Parameter kann den lokalen Cursor an den aufrufenden Batch, die aufrufende gespeicherte Prozedur oder den aufrufenden Trigger zurückgeben. Diese können den Parameter einer Cursorvariablen zuweisen, um nach dem Beenden der gespeicherten Prozedur auf den Cursor zu verweisen.An OUTPUT parameter is used to pass the local cursor back to the calling batch, stored procedure, or trigger, which can assign the parameter to a cursor variable to reference the cursor after the stored procedure terminates. Die Zuordnung des Cursors wird implizit aufgehoben, wenn der Batch, die gespeicherte Prozedur oder der Trigger beendet wird, es sei denn, der Cursor wurde in einem OUTPUT-Parameter zurückgegeben.The cursor is implicitly deallocated when the batch, stored procedure, or trigger terminates, unless the cursor was passed back in an OUTPUT parameter. Wenn die Rückgabe in einem OUTPUT-Parameter erfolgt, wird die Zuordnung des Cursors aufgehoben, wenn die Zuordnung der letzten auf ihn verweisenden Variablen aufgehoben wird oder wenn der Cursor den Gültigkeitsbereich verlässt.If it is passed back in an OUTPUT parameter, the cursor is deallocated when the last variable referencing it is deallocated or goes out of scope.

GLOBALGLOBAL
Gibt an, dass der Bereich des Cursors global zur Verbindung ist.Specifies that the scope of the cursor is global to the connection. Auf den Cursornamen kann in jeder gespeicherten Prozedur und in jedem Batch verwiesen werden, die bzw. der von der Verbindung ausgeführt wird.The cursor name can be referenced in any stored procedure or batch executed by the connection. Die Zuordnung des Cursors wird nur implizit aufgehoben, wenn die Verbindung getrennt wird.The cursor is only implicitly deallocated at disconnect.

Hinweis

Wird weder GLOBAL noch LOCAL angegeben, wird der Standard durch die Einstellung der Datenbankoption default to local cursor gesteuert.If neither GLOBAL or LOCAL is specified, the default is controlled by the setting of the default to local cursor database option.

FORWARD_ONLYFORWARD_ONLY
Gibt an, dass der Cursor von der ersten bis zur letzten Zeile nur vorwärts bewegt werden kann.Specifies that the cursor can only move forward and be scrolled from the first to the last row. FETCH NEXT ist die einzige unterstützte Abrufoption.FETCH NEXT is the only supported fetch option. Alle INSERT-, UPDATE- und DELETE-Anweisungen, die vom aktuellen Benutzer ausgeführt werden (oder von anderen Benutzern committet werden), die sich auf Zeilen im Resultset auswirken, sind beim Abrufen der Zeilen sichtbar.All insert, update, and delete statements made by the current user (or committed by other users) that affect rows in the result set are visible as the rows are fetched. Da mit dem Cursor nicht zurück gescrollt werden kann, sind Änderungen, die an Zeilen in der Datenbank vorgenommen wurden, nachdem die jeweilige Zeile abgerufen wurde, über den Cursor nicht sichtbar.Because the cursor cannot be scrolled backward, however, changes made to rows in the database after the row was fetched are not visible through the cursor. Vorwärtscursor sind standardmäßig dynamisch, d. h. dass alle Änderungen ermittelt werden, während die aktuelle Zeile verarbeitet wird.Forward-only cursors are dynamic by default, meaning that all changes are detected as the current row is processed. Damit kann der Cursor schneller gestartet werden, und Updates an den zugrunde liegenden Tabellen können im Resultset angezeigt werden.This provides faster cursor opening and enables the result set to display updates made to the underlying tables. Obwohl Vorwärtscursor das Zurückscrollen nicht unterstützen, können Anwendungen zum Anfang des Resultsets zurückkehren, indem der Cursor beendet und erneut gestartet wird.While forward-only cursors do not support backward scrolling, applications can return to the beginning of the result set by closing and reopening the cursor. Wenn FORWARD_ONLY ohne eines der Schlüsselwörter STATIC, KEYSET oder DYNAMIC angegeben wird, ist der Cursor ein dynamischer Cursor.If FORWARD_ONLY is specified without the STATIC, KEYSET, or DYNAMIC keywords, the cursor operates as a dynamic cursor. Wenn weder FORWARD_ONLY noch SCROLL angegeben wird, wird standardmäßig FORWARD_ONLY verwendet, es sei denn, die Schlüsselwörter STATIC, KEYSET oder DYNAMIC werden angegeben.When neither FORWARD_ONLY nor SCROLL is specified, FORWARD_ONLY is the default, unless the keywords STATIC, KEYSET, or DYNAMIC are specified. Die Cursor STATIC, KEYSET und DYNAMIC sind standardmäßig auf SCROLL festgelegt.STATIC, KEYSET, and DYNAMIC cursors default to SCROLL. Anders als bei Datenbank-APIs, wie z. B. ODBC und ADO, wird FORWARD_ONLY für Cursor des Typs STATIC, KEYSET und DYNAMIC Transact-SQLTransact-SQLunterstützt.Unlike database APIs such as ODBC and ADO, FORWARD_ONLY is supported with STATIC, KEYSET, and DYNAMIC Transact-SQLTransact-SQL cursors.

STATICSTATIC
Legt fest, dass der Cursor das Resultset immer so anzeigt, wie es war, als der Cursor gestartet wurde, und erstellt eine temporäre Kopie der Daten, die vom Cursor verwendet werden.Specifies that the cursor always displays the result set as it was when the cursor was first opened, and makes a temporary copy of the data to be used by the cursor. Alle Anforderungen an den Cursor werden von dieser temporären Tabelle in der tempdb beantwortet.All requests to the cursor are answered from this temporary table in tempdb. Aus diesem Grund werden INSERT-, UPDATE- und DELETE-Anweisungen für Basistabellen nicht in den Daten widergespiegelt, die durch Abrufvorgänge an diesen Cursor zurückgegeben werden, und der Cursor erkennt keine Änderungen an der Mitgliedschaft, der Reihenfolge oder den Werten des Resultsets, nachdem er geöffnet wurde.Therefore inserts, updates, and deletes made to base tables are not reflected in the data returned by fetches made to this cursor, and this cursor does not detect changes made to the membership, order, or values of the result set after the cursor is opened. Statische Cursor können ihre eigenen UPDATE-, DELETE- und INSERT-Anweisungen erkennen, obwohl dies nicht erforderlich ist.Static cursors may detect their own updates, deletes, and inserts, although they are not required to do so. Angenommen ein statischer Cursor ruft eine Zeile ab, und eine andere Anwendung aktualisiert diese Zeile dann.For example, suppose a static cursor fetches a row, and another application then updates that row. Wenn die Anwendung die Zeile erneut vom statischen Cursor abruft, sind die erkannten Werte unverändert, obwohl die andere Anwendung Änderungen vorgenommen hat.If the application refetches the row from the static cursor, the values it sees are unchanged, despite the changes made by the other application. Alle Arten des Scrollens werden unterstützt.All types of scrolling are supported.

KEYSETKEYSET
Gibt an, dass im Cursor die Mitgliedschaft und Reihenfolge der Zeilen fest ist, wenn der Cursor geöffnet wird.Specifies that the membership and order of rows in the cursor are fixed when the cursor is opened. Die Menge der Schlüssel, welche die Zeilen eindeutig identifizieren, wird in einer Tabelle in tempdb erstellt, die als keyset bezeichnet wird.The set of keys that uniquely identify the rows is built into a table in tempdb known as the keyset. Mit seiner Fähigkeit, Änderungen zu erkennen, bietet dieser Cursor Funktionalität zwischen statischen und dynamischen Cursor.This cursor provides functionality between a static and a dynamic cursor in its ability to detect changes. Wie ein statischer Cursor ermittelt er nicht immer Änderungen an der Mitgliedschaft und Reihenfolge des Resultsets.Like a static cursor, it does not always detect changes to the membership and order of the result set. Wie ein dynamischer Cursor ermittelt er Änderungen an den Werten der Zeilen im Resultset.Like a dynamic cursor, it does detect changes to the values of rows in the result set. Keysetgesteuerte Cursor werden von einer Reihe von eindeutigen Bezeichnern (Schlüssel) gesteuert, die als das Keyset bezeichnet werden.Keyset-driven cursors are controlled by a set of unique identifiers (keys) known as the keyset. Die Schlüssel werden anhand einer Reihe von Spalten erstellt, die die Zeilen im Resultset eindeutig identifizieren.The keys are built from a set of columns that uniquely identify the rows in the result set. Das Keyset besteht aus Schlüsselwerten aus allen Zeilen, die von der Abfrageanweisung zurückgegeben werden.The keyset is the set of key values from all the rows returned by the query statement. Mit einem keysetgesteuerten Cursor wird für jede Zeile im Cursor ein Schlüssel erstellt und gespeichert, der wiederum entweder auf der Clientarbeitsstation oder dem Server gespeichert wird.With keyset-driven cursors, a key is built and saved for each row in the cursor and stored either on the client workstation or on the server. Wenn Sie auf eine beliebige Zeile zugreifen, wird der gespeicherte Schlüssel zum Abrufen der aktuellen Datenwerte aus der Datenquelle verwendet.When you access each row, the stored key is used to fetch the current data values from the data source. In einem keysetgesteuerter Cursor wird die Mitgliedschaft des Resultsets fixiert, wenn das Keyset vollständig gefüllt wurde.In a keyset-driven cursor, result set membership is frozen when the keyset is fully populated. Daher sind Ergänzungen und Updates, die die Mitgliedschaft betreffen, nicht Teil des Resultsets, bis dieses neu geöffnet wird.Thereafter, additions or updates that affect membership are not a part of the result set until it is reopened. Änderungen an Datenwerten (entweder durch den Besitzer des Keysets oder andere Prozesse), die sichtbar sind, während der Benutzer durch das Resultset scrollt:Changes to data values (made either by the keyset owner or other processes) are visible as the user scrolls through the result set:

  • Wenn eine Zeile gelöscht wird, wird beim Abrufen der Zeile der Wert „-2“ für @@FETCH_STATUS zurückgegeben, da die gelöschte Zeile als Lücke im Resultset angezeigt wird.If a row is deleted, an attempt to fetch the row returns an @@FETCH_STATUS of -2 because the deleted row appears as a gap in the result set. Der Schlüssel für die Zeile ist im Keyset enthalten, aber die Zeile ist nicht mehr im Resultset vorhanden.The key for the row exists in the keyset, but the row no longer exists in the result set.
  • INSERTs außerhalb des Cursors (durch andere Prozesse) sind nur sichtbar, wenn der Cursor beendet und neu gestartet wird.Inserts made outside the cursor (by other processes) are visible only if the cursor is closed and reopened. INSERTs innerhalb des Cursors werden am Ende des Resultsets angezeigt.Inserts made from inside the cursor are visible at the end of the result set.
  • Updates von Schlüsselwerten von außerhalb des Cursors sind vergleichbar mit einem Löschen der alten Zeile, gefolgt von einem Einfügen der neuen Zeile.Updates of key values from outside the cursor resemble a delete of the old row followed by an insert of the new row. Die Zeile mit den neuen Werten ist nicht sichtbar, und bei Versuchen, die Zeile mit den alten Werten abzurufen, wird @@FETCH_STATUS mit dem Wert -2 zurückgegeben.The row with the new values is not visible, and attempts to fetch the row with the old values return an @@FETCH_STATUS of -2. Die neuen Werte sind sichtbar, wenn das Update über den Cursor durch Angeben der WHERE CURRENT OF-Klausel durchgeführt wird.The new values are visible if the update is done through the cursor by specifying the WHERE CURRENT OF clause.

Hinweis

Wenn die Abfrage auf mindestens eine Tabelle ohne einen eindeutigen Index verweist, wird der Keysetcursor in einen statischen Cursor konvertiert.If the query references at least one table without a unique index, the keyset cursor is converted to a static cursor.

DYNAMICDYNAMIC
Definiert einen Cursor, der alle Datenänderungen an den Zeilen im Resultset widerspiegelt, während Sie im Cursor scrollen und einen neuen Datensatz abrufen, unabhängig davon, ob die Änderungen innerhalb oder außerhalb (durch andere Benutzer) des Cursors vorgenommen werden.Defines a cursor that reflects all data changes made to the rows in its result set as you scroll around the cursor and fetch a new record, regardless of whether the changes occur from inside the cursor or by other users outside the cursor. Daher sind alle INSERT-, UPDATE- und -DELETE-Anweisungen von allen Benutzern über den Cursor sichtbar.Therefore all insert, update, and delete statements made by all users are visible through the cursor. Datenwerte, Reihenfolge und Mitgliedschaft der Zeilen können sich bei jedem Abrufvorgang ändern.The data values, order, and membership of the rows can change on each fetch. Die Abrufoption ABSOLUTE wird für dynamische Cursor nicht unterstützt.The ABSOLUTE fetch option is not supported with dynamic cursors. Updates, die außerhalb des Cursors ausgeführt werden, sind nur dann sichtbar, wenn ein Commit für sie ausgeführt wurde (es sei denn, die Transaktionsisolationsstufe des Cursors wurde auf UNCOMMITTED festgelegt).Updates made outside the cursor are not visible until they are committed (unless the cursor transaction isolation level is set to UNCOMMITTED). Angenommen ein dynamischer Cursor ruft zwei Zeilen ab, und eine andere Anwendung aktualisiert daraufhin eine dieser Zeilen und löscht die andere.For example, suppose a dynamic cursor fetches two rows and another application then updates one of those rows and deletes the other. Wenn der dynamische Cursor diese Zeilen dann abruft, findet er die gelöschte Zeile nicht, die neuen Werte der aktualisierten Zeile werden jedoch angezeigt.If the dynamic cursor then fetches those rows, it will not find the deleted row, but it will display the new values for the updated row.

FAST_FORWARDFAST_FORWARD
Gibt einen FORWARD_ONLY-, READ_ONLY-Cursor mit aktivierten Leistungsoptimierungen an.Specifies a FORWARD_ONLY, READ_ONLY cursor with performance optimizations enabled. FAST_FORWARD kann nicht angegeben werden, wenn SCROLL oder FOR_UPDATE ebenfalls angegeben ist.FAST_FORWARD cannot be specified if SCROLL or FOR_UPDATE is also specified. Diese Art von Cursor lässt keine Änderungen an den Daten innerhalb des Cursors zu.This type of cursor does not allow data modifications from inside the cursor.

Hinweis

FAST_FORWARD und FORWARD_ONLY können nicht in der gleichen DECLARE CURSOR-Anweisung verwendet werden.Both FAST_FORWARD and FORWARD_ONLY can be used in the same DECLARE CURSOR statement.

READ_ONLYREAD_ONLY
Verhindert, dass über diesen Cursor Updates vorgenommen werden.Prevents updates made through this cursor. Auf den Cursor kann in einer UPDATE- oder DELETE-Anweisung nicht in einer WHERE CURRENT OF-Klausel verwiesen werden.The cursor cannot be referenced in a WHERE CURRENT OF clause in an UPDATE or DELETE statement. Diese Option überschreibt die Standardeinstellung, nach der ein Cursor aktualisiert werden kann.This option overrides the default capability of a cursor to be updated.

SCROLL_LOCKSSCROLL_LOCKS
Gibt an, dass positionierte Updates oder Löschungen durch den Cursor garantiert erfolgreich sind.Specifies that positioned updates or deletes made through the cursor are guaranteed to succeed. SQL ServerSQL Server sperrt die Zeilen, während sie in den Cursor eingelesen werden, um ihre Verfügbarkeit für spätere Änderungen sicherzustellen.locks the rows as they are read into the cursor to ensure their availability for later modifications. SCROLL_LOCKS kann nicht angegeben werden, wenn FAST_FORWARD oder STATIC ebenfalls angegeben ist.SCROLL_LOCKS cannot be specified if FAST_FORWARD or STATIC is also specified.

OPTIMISTICOPTIMISTIC
Gibt an, dass positionierte Updates oder Löschungen durch den Cursor nicht erfolgreich sind, wenn die Zeile seit dem letzten Einlesen in den Cursor aktualisiert wurde.Specifies that positioned updates or deletes made through the cursor do not succeed if the row has been updated since it was read into the cursor. SQL ServerSQL Server sperrt keine Zeilen, während sie in den Cursor eingelesen werden.does not lock rows as they are read into the cursor. Stattdessen wird durch Vergleiche von timestamp-Spaltenwerten oder einen Prüfsummenwert, wenn die Tabelle keine timestamp-Spalte aufweist, bestimmt, ob die Zeile nach dem Einlesen in den Cursor geändert wurde.It instead uses comparisons of timestamp column values, or a checksum value if the table has no timestamp column, to determine whether the row was modified after it was read into the cursor. Wurde die Zeile geändert, so schlägt der versuchte positionierte Update- oder Löschvorgang fehl.If the row was modified, the attempted positioned update or delete fails. OPTIMISTIC kann nicht angegeben werden, wenn FAST_FORWARD ebenfalls angegeben ist.OPTIMISTIC cannot be specified if FAST_FORWARD is also specified.

TYPE_WARNINGTYPE_WARNING
Gibt an, dass dem Client eine Warnmeldung gesendet wird, wenn der Cursor vom angeforderten Typ in einen anderen Typ implizit konvertiert wird.Specifies that a warning message is sent to the client when the cursor is implicitly converted from the requested type to another.

select_statementselect_statement
Eine standardmäßige SELECT-Anweisung, die das Resultset des Cursors definiert.Is a standard SELECT statement that defines the result set of the cursor. Die Schlüsselwörter COMPUTE, COMPUTE BY, FOR BROWSE und INTO sind in select_statement einer Cursordeklaration nicht zulässig.The keywords COMPUTE, COMPUTE BY, FOR BROWSE, and INTO are not allowed within select_statement of a cursor declaration.

Hinweis

Sie können einen Abfragehinweis in einer Cursordeklaration verwenden. Wenn Sie jedoch auch die FOR UPDATE OF-Klausel verwenden, geben Sie OPTION (<query_hint>) nach FOR UPDATE OF an.You can use a query hint within a cursor declaration; however, if you also use the FOR UPDATE OF clause, specify OPTION (<query_hint>) after FOR UPDATE OF.

SQL ServerSQL Server konvertiert den Cursor implizit in einen anderen Typ, wenn die Klauseln in select_statement in Konflikt mit der Funktionalität des angeforderten Cursortyps stehen.implicitly converts the cursor to another type if clauses in select_statement conflict with the functionality of the requested cursor type. Weitere Informationen finden Sie unter Implizite Cursorkonvertierungen.For more information, see Implicit Cursor Conversions.

FOR UPDATE [OF column_name [ , ...n]]FOR UPDATE [OF column_name [,...n]]
Definiert aktualisierbare Spalten innerhalb des Cursors.Defines updatable columns within the cursor. Wenn OF <column_name> [, <... n>] angegeben wird, können Änderungen nur in den aufgelisteten Spalten vorgenommen werden.If OF <column_name> [, <... n>] is supplied, only the columns listed allow modifications. Wenn UPDATE ohne Spaltenliste angegeben wird, können alle Spalten aktualisiert werden, sofern nicht die Parallelitätsoption READ_ONLY angegeben wurde.If UPDATE is specified without a column list, all columns can be updated, unless the READ_ONLY concurrency option was specified.

RemarksRemarks

DECLARE CURSOR definiert die Attribute eines Transact-SQLTransact-SQL-Servercursors, wie z. B. dessen Scrollverhalten, sowie die Abfrage, die zum Erstellen des Resultsets verwendet wird, auf das der Cursor ausgeführt wird.DECLARE CURSOR defines the attributes of a Transact-SQLTransact-SQL server cursor, such as its scrolling behavior and the query used to build the result set on which the cursor operates. Die OPEN-Anweisung füllt das Resultset auf, FETCH gibt eine Zeile aus dem Resultset zurück.The OPEN statement populates the result set, and FETCH returns a row from the result set. Die CLOSE-Anweisung gibt das aktuelle Resultset frei, das dem Cursor zugeordnet ist.The CLOSE statement releases the current result set associated with the cursor. Die DEALLOCATE-Anweisung gibt die vom Cursor verwendeten Ressourcen frei.The DEALLOCATE statement releases the resources used by the cursor.

Die erste Form der DECLARE CURSOR-Anweisung verwendet zum Deklarieren des Cursorverhaltens die ISO-Syntax.The first form of the DECLARE CURSOR statement uses the ISO syntax for declaring cursor behaviors. Die zweite Form der DECLARE CURSOR-Anweisung verwendet Transact-SQLTransact-SQL-Erweiterungen, die die Definition von Cursorn mithilfe der gleichen Cursortypen zulassen, die in den Datenbank-API-Cursor-Funktionen von ODBC oder ADO verwendet werden.The second form of DECLARE CURSOR uses Transact-SQLTransact-SQL extensions that allow you to define cursors using the same cursor types used in the database API cursor functions of ODBC or ADO.

Die beiden Formen können nicht gleichzeitig verwendet werden.You cannot mix the two forms. Wenn Sie das Schlüsselwort SCROLL oder INSENSITIVE vor dem Schlüsselwort CURSOR angeben, können Sie zwischen den Schlüsselwörtern CURSOR und FOR <select_statement> keine Schlüsselwörter verwenden.If you specify the SCROLL or INSENSITIVE keywords before the CURSOR keyword, you cannot use any keywords between the CURSOR and FOR <select_statement> keywords. Wenn Sie Schlüsselwörter zwischen den Schlüsselwörtern CURSOR und FOR <select_statement> angeben, können Sie SCROLL oder INSENSITIVE nicht vor dem Schlüsselwort CURSOR angeben.If you specify any keywords between the CURSOR and FOR <select_statement> keywords, you cannot specify SCROLL or INSENSITIVE before the CURSOR keyword.

Wird in einer DECLARE CURSOR-Anweisung mit der Transact-SQLTransact-SQL-Syntax weder READ_ONLY, OPTIMISTIC noch SCROLL_LOCKS angegeben, ist der Standard folgendermaßen:If a DECLARE CURSOR using Transact-SQLTransact-SQL syntax does not specify READ_ONLY, OPTIMISTIC, or SCROLL_LOCKS, the default is as follows:

  • Wenn die SELECT-Anweisung keine Updates (wegen fehlender Berechtigungen, Zugriff auf Remotetabellen, die keine Updates unterstützen usw.) unterstützt, ist der Cursor READ_ONLY.If the SELECT statement does not support updates (insufficient permissions, accessing remote tables that do not support updates, and so on), the cursor is READ_ONLY.

  • Die Cursor STATIC und FAST_FORWARD sind standardmäßig auf READ_ONLY festgelegt.STATIC and FAST_FORWARD cursors default to READ_ONLY.

  • Die Cursor DYNAMIC und KEYSET sind standardmäßig auf OPTIMISTIC festgelegt.DYNAMIC and KEYSET cursors default to OPTIMISTIC.

Ein Verweis auf Cursornamen ist nur von anderen Transact-SQLTransact-SQL-Anweisungen aus möglich.Cursor names can be referenced only by other Transact-SQLTransact-SQL statements. Auf sie kann nicht von Datenbank-API-Funktionen verwiesen werden.They cannot be referenced by database API functions. Nach der Deklaration eines Cursors besteht beispielsweise keine Möglichkeit, in einer OLE DB-, ODBC- oder ADO-Funktion oder -Methode auf den Cursornamen zu verweisen.For example, after declaring a cursor, the cursor name cannot be referenced from OLE DB, ODBC or ADO functions or methods. Die Zeilen des Cursors können nicht mithilfe von API-Funktionen oder API-Methoden abgerufen werden. Ein Abrufen der Zeilen ist lediglich mit den FETCH-Anweisungen von Transact-SQLTransact-SQL möglich.The cursor rows cannot be fetched using the fetch functions or methods of the APIs; the rows can be fetched only by Transact-SQLTransact-SQL FETCH statements.

Nach der Deklaration eines Cursors können die Eigenschaften des Cursors mithilfe der folgenden gespeicherten Systemprozeduren bestimmt werden:After a cursor has been declared, these system stored procedures can be used to determine the characteristics of the cursor.

Gespeicherte SystemprozedurenSystem stored procedures und BeschreibungDescription
sp_cursor_listsp_cursor_list Gibt eine Liste der in der Verbindung aktuell sichtbaren Cursor und ihrer Attribute zurück.Returns a list of cursors currently visible on the connection and their attributes.
sp_describe_cursorsp_describe_cursor Beschreibt die Attribute eines Cursors, z. B. ob es sich um einen Vorwärtscursor oder einen Scrollcursor handelt.Describes the attributes of a cursor, such as whether it is a forward-only or scrolling cursor.
sp_describe_cursor_columnssp_describe_cursor_columns Beschreibt die Spaltenattribute im Resultset des Cursors.Describes the attributes of the columns in the cursor result set.
sp_describe_cursor_tablessp_describe_cursor_tables Beschreibt die Basistabellen, auf die der Cursor zugreift.Describes the base tables accessed by the cursor.

Variablen können möglicherweise als Teil von select_statement verwendet werden, die einen Cursor deklariert.Variables may be used as part of the select_statement that declares a cursor. Die Werte von Cursorvariablen ändern sich nach dem Deklarieren eines Cursors nicht.Cursor variable values do not change after a cursor is declared.

BerechtigungenPermissions

In der Standardeinstellung haben alle Benutzer die DECLARE CURSOR-Berechtigung, wenn sie über die SELECT-Berechtigungen für die im Cursor verwendeten Sichten, Tabellen und Spalten verfügen.Permissions of DECLARE CURSOR default to any user that has SELECT permissions on the views, tables, and columns used in the cursor.

EinschränkungenLimitations and Restrictions

In einer Tabelle mit einem gruppierten Columnstore-Index können keine Cursor oder Trigger verwendet werden.You cannot use cursors or triggers on a table with a clustered columnstore index. Diese Einschränkung gilt nicht für nicht gruppierte Columnstore-Indizes; in einer Tabelle mit einem nicht gruppierten Columnstore-Index können Cursor und Trigger verwendet werden.This restriction does not apply to nonclustered columnstore indexes; you can use cursors and triggers on a table with a nonclustered columnstore index.

BeispieleExamples

A.A. Verwenden des einfachen Cursors und der einfachen SyntaxUsing simple cursor and syntax

Das beim Öffnen dieses Cursors generierte Resultset enthält alle Zeilen und Spalten in der Tabelle.The result set generated at the opening of this cursor includes all rows and all columns in the table. Dieser Cursor kann aktualisiert werden. Alle Updates und Löschungen werden in Abrufen dieses Cursors dargestellt.This cursor can be updated, and all updates and deletes are represented in fetches made against this cursor. FETCH NEXT ist der einzige verfügbare Abruf, da die SCROLL-Option nicht angegeben worden ist.FETCH NEXT is the only fetch available because the SCROLL option has not been specified.

DECLARE vend_cursor CURSOR  
    FOR SELECT * FROM Purchasing.Vendor  
OPEN vend_cursor  
FETCH NEXT FROM vend_cursor;  

B.B. Verwenden von geschachtelten Cursorn, um eine Berichtsausgabe zu erzeugenUsing nested cursors to produce report output

Im folgenden Beispiel wird gezeigt, wie Cursor zum Erzeugen komplexer Berichte geschachtelt werden können.The following example shows how cursors can be nested to produce complex reports. Der innere Cursor wird für jeden Anbieter deklariert.The inner cursor is declared for each vendor.

SET NOCOUNT ON;  
  
DECLARE @vendor_id int, @vendor_name nvarchar(50),  
    @message varchar(80), @product nvarchar(50);  
  
PRINT '-------- Vendor Products Report --------';  
  
DECLARE vendor_cursor CURSOR FOR   
SELECT VendorID, Name  
FROM Purchasing.Vendor  
WHERE PreferredVendorStatus = 1  
ORDER BY VendorID;  
  
OPEN vendor_cursor  
  
FETCH NEXT FROM vendor_cursor   
INTO @vendor_id, @vendor_name  
  
WHILE @@FETCH_STATUS = 0  
BEGIN  
    PRINT ' '  
    SELECT @message = '----- Products From Vendor: ' +   
        @vendor_name  
  
    PRINT @message  
  
    -- Declare an inner cursor based     
    -- on vendor_id from the outer cursor.  
  
    DECLARE product_cursor CURSOR FOR   
    SELECT v.Name  
    FROM Purchasing.ProductVendor pv, Production.Product v  
    WHERE pv.ProductID = v.ProductID AND  
    pv.VendorID = @vendor_id  -- Variable value from the outer cursor  
  
    OPEN product_cursor  
    FETCH NEXT FROM product_cursor INTO @product  
  
    IF @@FETCH_STATUS <> 0   
        PRINT '         <<None>>'       
  
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
  
        SELECT @message = '         ' + @product  
        PRINT @message  
        FETCH NEXT FROM product_cursor INTO @product  
        END  
  
    CLOSE product_cursor  
    DEALLOCATE product_cursor  
        -- Get the next vendor.  
    FETCH NEXT FROM vendor_cursor   
    INTO @vendor_id, @vendor_name  
END   
CLOSE vendor_cursor;  
DEALLOCATE vendor_cursor;  

Weitere InformationenSee Also

@@FETCH_STATUS (Transact-SQL) @@FETCH_STATUS (Transact-SQL)
CLOSE (Transact-SQL) CLOSE (Transact-SQL)
Cursors (Transact-SQL) Cursors (Transact-SQL)
DEALLOCATE (Transact-SQL) DEALLOCATE (Transact-SQL)
FETCH (Transact-SQL) FETCH (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
sp_configure (Transact-SQL)sp_configure (Transact-SQL)