Freigeben über


sp_cursor (Transact-SQL)

Gilt für: SQL Server

Fordert positionierte Updates an. Mithilfe dieser Prozedur werden Vorgänge für mindestens eine Zeile im Fetchpuffer eines Cursors ausgeführt. sp_cursor wird aufgerufen, indem in einem TDS-Paket (Tabular Data Stream) angegeben ID = 1 wird.

Transact-SQL-Syntaxkonventionen

Syntax

sp_cursor cursor , optype , rownum , table
    [ , value [ ...n ] ]
[ ; ]

Argumente

Cursor

Das Cursorhandle. Der Cursorparameter ist int und kann nicht sein NULL. Dieser Parameter ist der handle vom Datenbank-Engine generierte Wert und wird von der sp_cursoropen Prozedur zurückgegeben.

optype

Ein erforderlicher Parameter, der angibt, welchen Vorgang der Cursor ausführt. Der Optype-Parameter erfordert einen der folgenden Werte.

Wert Name Beschreibung
0X0001 UPDATE Wird zum Update mindestens einer Zeile im Fetchpuffer verwendet. Die in Rownum angegebenen Zeilen werden erneut verwendet und aktualisiert.
0x0002 DELETE Wird zum Löschen mindestens einer Zeile im Fetchpuffer verwendet. Die zeilen, die in rownum angegeben sind, werden erneut auf sie zugreifen und gelöscht.
0X0004 INSERT Fügt Daten ein, ohne eine INSERT Anweisung zu erstellen.
0X0008 REFRESH Wird verwendet, um den Puffer aus zugrunde liegenden Tabellen neu zu füllen und kann verwendet werden, um die Zeile zu aktualisieren, wenn ein Update oder Löschvorgang aufgrund eines optimistischen Parallelitätssteuerelements oder nach einem UPDATE.
0X10 LOCK Bewirkt, dass eine Aktualisierungssperre (U) auf der Seite mit der angegebenen Zeile abgerufen wird. Diese Sperre ist mit freigegebenen Sperren (S) kompatibel, jedoch nicht mit exklusiven Sperren (X) oder anderen Updatesperren. Kann verwendet werden, um eine kurzfristige Sperre zu implementieren.
0X20 SETPOSITION Wird nur verwendet, wenn das Programm eine nachfolgende DELETE oder UPDATE Anweisung ausstellen wird.
0X40 ABSOLUTE Kann nur mit UPDATE oder DELETEverwendet werden. ABSOLUTE wird nur für KEYSET Cursor verwendet (wird für DYNAMIC Cursor ignoriert), und STATIC Cursor können nicht aktualisiert werden.

Hinweis: Wenn ABSOLUTE in einer Zeile in der nicht abgerufenen Keysetzeile angegeben wird, schlägt der Vorgang möglicherweise die Parallelitätsprüfung fehl, und das Rückgabeergebnis kann nicht garantiert werden.

rownum

Gibt an, welche Zeilen im Abrufpuffer der Cursor betreibt, aktualisiert oder löscht. Dieser Parameter wirkt sich nicht auf den Ausgangspunkt eines RELATIVE, NEXToder Abrufvorgangs, PREVIOUS oder auf Aktualisierungen oder Löschvorgänge aus, die mit sp_cursor.

rownum ist ein erforderlicher Parameter, der einen Int-Eingabewert aufruft.

  • 1

    Gibt die erste Zeile im Fetchpuffer an.

  • 2, 3, 4, ...n

    Kennzeichnet die zweite, dritte und vierte Zeile usw.

  • 0

    Gibt alle Zeilen im Fetchpuffer an.

Dieser Parameter ist nur für die Verwendung mit UPDATE, , DELETE, REFRESHoder LOCK optype -Werten gültig.

Tabelle

Der Tabellenname, der die Tabelle identifiziert, für die der Optype gilt, wenn die Cursordefinition eine Verknüpfung umfasst, oder mehrdeutige Spaltennamen werden vom Wertparameter zurückgegeben. Wenn keine bestimmte Tabelle festgelegt ist, ist die Standardeinstellung die erste Tabelle in der FROM Klausel. Der Tabellenparameter ist optional und erfordert einen Zeichenfolgeneingabewert. Die Zeichenfolge kann als beliebiges Zeichen oder Unicode-Datentyp oder als mehrteiliger Tabellenname angegeben werden.

value

Wird zum Einfügen oder Aktualisieren von Werten verwendet. Der Wertzeichenfolgenparameter wird nur mit UPDATE werten und INSERT optype verwendet. Die Zeichenfolge kann als beliebiges Zeichen oder Unicode-Datentyp angegeben werden.

Die Parameternamen für den Wert können vom Benutzer zugewiesen werden.

Rückgabecodewerte

0 (erfolgreich) oder 1 Fehler.

Hinweise

Der Optype-Parameter

Mit Ausnahme der Kombinationen mit SETPOSITION UPDATE, , DELETE, REFRESHoder LOCK; oder ABSOLUTE mit einem UPDATE oder DELETEoder , die Optype-Werte schließen sich gegenseitig aus.

Die SET Klausel des UPDATE Werts wird aus dem Wertparameter erstellt.

Ein Vorteil der Verwendung des INSERT <optype> Werts besteht darin, dass Sie das Konvertieren von Nicht-Zeichendaten in ein Zeichenformat für Einfügungen vermeiden können. Die Werte werden auf die gleiche Weise wie UPDATE. Wenn erforderliche Spalten nicht enthalten sind, schlägt der INSERT Fehler fehl.

  • Der SETPOSITION Wert wirkt sich nicht auf den Startpunkt eines RELATIVE, NEXToder Abrufvorgangs aus PREVIOUS , oder führen keine Aktualisierungen oder Löschvorgänge aus, die mit der sp_cursor Schnittstelle ausgeführt werden. Jede Zahl, die keine Zeile im Abrufpuffer angibt, führt dazu, dass die Position festgelegt 1wird, ohne dass ein Fehler zurückgegeben wird. Sobald SETPOSITION die Ausführung erfolgt, bleibt die Position bis zum nächsten sp_cursorfetch Vorgang, T-SQL-Vorgang FETCH oder sp_cursor SETPOSITION Vorgang über denselben Cursor wirksam. Bei einem nachfolgenden sp_cursorfetch Vorgang wird die Position des Cursors auf die erste Zeile im neuen Abrufpuffer festgelegt, während andere Cursoraufrufe den Wert der Position nicht beeinflussen. SETPOSITION kann durch eine OR Klausel mit REFRESH, UPDATE, , DELETEoder LOCK um den Wert der Position auf die letzte geänderte Zeile festzulegen.

Wenn eine Zeile im Abrufpuffer nicht über den Rownum-Parameter angegeben wird, wird die Position auf 1 festgelegt, ohne dass ein Fehler zurückgegeben wird. Sobald die Position festgelegt ist, bleibt sie wirksam, bis der nächste Vorgang, der T-SQL-Vorgang FETCH oder sp_cursor SETPOSITION der vorgang sp_cursorfetch auf demselben Cursor ausgeführt wird.

SETPOSITION kann durch eine OR Klausel mit REFRESH, UPDATE, , DELETEoder LOCK um die Cursorposition auf die letzte geänderte Zeile festgelegt werden.

Der Rownum-Parameter

Wenn angegeben, kann der Rownum-Parameter als Zeilennummer innerhalb des Keysets anstelle der Zeilennummer innerhalb des Abrufpuffers interpretiert werden. Der Benutzer ist für die Einhaltung der Parallelitätssteuerung verantwortlich. Dies bedeutet, dass Sie für SCROLL_LOCKS Cursor unabhängig voneinander eine Sperre für die angegebene Zeile verwalten müssen (die über eine Transaktion ausgeführt werden kann). Für OPTIMISTIC Cursor müssen Sie die Zeile zuvor abgerufen haben, um diesen Vorgang auszuführen.

Der Tabellenparameter

Wenn der Optype-Wert oder INSERT UPDATE eine vollständige Aktualisierungs- oder Einfüge-Anweisung als Wertparameter übermittelt wird, wird der für die Tabelle angegebene Wert ignoriert.

Hinweis

Im Zusammenhang mit Ansichten kann nur eine Tabelle geändert werden, die an der Ansicht teilnimmt. Die Namen der Wertparameterspalten müssen die Spaltennamen in der Ansicht widerspiegeln, der Tabellenname kann jedoch die der zugrunde liegenden Basistabelle sein (in diesem Fall sp_cursor wird der Ansichtsname ersetzt).

Der Wertparameter

Es gibt zwei Alternativen zu den Regeln für die Verwendung von Werten , wie weiter oben im Abschnitt "Argumente" angegeben:

  1. Sie können einen Namen verwenden, der dem Namen der Spalte in der Auswahlliste für alle benannten Wertparameter vorangestellt ist@. Ein Vorteil dieser Alternative besteht darin, dass die Datenkonvertierung möglicherweise nicht erforderlich ist.

  2. Verwenden Sie einen Parameter, um entweder eine vollständige UPDATE oder INSERT anweisung zu übermitteln, oder verwenden Sie mehrere Parameter, um Teile einer oder INSERT Anweisung UPDATE zu übermitteln, die die Datenbank-Engine dann in eine vollständige Anweisung integriert. Beispiele finden Sie im Abschnitt "Beispiele " weiter unten in diesem Artikel.

Beispiele

Alternativer Wertparameter verwendet

Für UPDATE

Wenn ein einzelner Parameter verwendet wird, kann eine UPDATE Anweisung mithilfe der folgenden Syntax übermittelt werden:

[ [ UPDATE <table_name> ] SET ] { <column name> = expression } [ , ...n ]

Wenn UPDATE <table_name> angegeben, wird jeder für den Tabellenparameter angegebene Wert ignoriert.

Wenn mehrere Parameter verwendet werden, muss der erste Parameter eine Zeichenfolge in der folgenden Form sein:

[ SET ] <column name> = expression [ , ...n ]

Die nachfolgenden Parameter müssen in Form von:

<column name> = expression [ , ...n ]

In diesem Fall ist die in der konstruierten Update-Anweisung entweder <table_name> angegeben oder standardmäßig vom Tabellenparameter festgelegt.

Für INSERT

Wenn ein einzelner Parameter verwendet wird, kann eine INSERT Anweisung mithilfe der folgenden Syntax übermittelt werden:

[ [ INSERT [ INTO ] <table_name> ] VALUES ] ( <expression> [ , ...n ] )

Wenn INSERT <table_name> angegeben, wird jeder für den Tabellenparameter angegebene Wert ignoriert.

Wenn mehrere Parameter verwendet werden, muss der erste Parameter eine Zeichenfolge in der folgenden Form sein:

[ VALUES ] ( <expression> [ , ...n ] )

Die nachfolgenden Parameter müssen sich in Form von expression [ , ...n ], mit Ausnahme der Angabe, VALUES befinden, in diesem Fall muss nach dem letzten Ausdruck ein nachgestellter ) Parameter vorhanden sein. In diesem Fall ist die in der konstruierten Anweisung entweder <table_name> vom Tabellenparameter angegebene oder standardmäßig festgelegte UPDATE Anweisung.

Hinweis

Es ist möglich, einen Parameter als benannten Parameter zu übermitteln, z. B @values. . In diesem Fall können keine anderen benannten Parameter verwendet werden.