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 DELETE verwendet 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
, NEXT
oder 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
, REFRESH
oder 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
, REFRESH
oder LOCK
; oder ABSOLUTE
mit einem UPDATE
oder DELETE
oder , 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 einesRELATIVE
,NEXT
oder Abrufvorgangs ausPREVIOUS
, oder führen keine Aktualisierungen oder Löschvorgänge aus, die mit dersp_cursor
Schnittstelle ausgeführt werden. Jede Zahl, die keine Zeile im Abrufpuffer angibt, führt dazu, dass die Position festgelegt1
wird, ohne dass ein Fehler zurückgegeben wird. SobaldSETPOSITION
die Ausführung erfolgt, bleibt die Position bis zum nächstensp_cursorfetch
Vorgang, T-SQL-VorgangFETCH
odersp_cursor
SETPOSITION
Vorgang über denselben Cursor wirksam. Bei einem nachfolgendensp_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 eineOR
Klausel mitREFRESH
,UPDATE
, ,DELETE
oderLOCK
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
, , DELETE
oder 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:
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.Verwenden Sie einen Parameter, um entweder eine vollständige
UPDATE
oderINSERT
anweisung zu übermitteln, oder verwenden Sie mehrere Parameter, um Teile einer oderINSERT
AnweisungUPDATE
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.