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 id = 1 in einem TDS-Paket (Tabellarischer Datenstrom) angegeben wird.
Gilt für: SQL Server (SQL Server 2008 (10.0.x) bis zur aktuellen Version) |
Transact-SQL-Syntaxkonventionen
Syntax
sp_cursor cursor, optype, rownum, table
[ , value[...n]]]
Argumente
Cursor
Das Cursorhandle. Cursor ist ein erforderlicher Parameter, der einen Int-Eingabewert aufruft. cursor is the handle value generated by SQL Server and returned by the sp_cursoropen procedure.
optype
Ein erforderlicher Parameter, der festlegt, welcher Vorgang vom Cursor ausgeführt wird. optype erfordert einen der folgenden Int-Eingabewerte .
Wert | Name | Beschreibung |
---|---|---|
0X0001 | UPDATE | Wird zum Update mindestens einer Zeile im Fetchpuffer verwendet. Auf die in Rownum angegebenen Zeilen wird erneut zugegriffen und aktualisiert. |
0x0002 | DELETE | Wird zum Löschen mindestens einer Zeile im Fetchpuffer verwendet. Auf die in Rownum angegebenen Zeilen wird erneut zugegriffen und gelöscht. |
0X0004 | INSERT | Fügt Daten ein, ohne eine SQL INSERT-Anweisung zu erstellen. |
0X0008 | REFRESH | Wird verwendet, um den Puffer mithilfe zugrunde liegender Tabellen aufzufüllen, und kann zum Update der Zeile verwendet werden, wenn ein Update- oder Löschvorgang aufgrund der Steuerung durch vollständige Parallelität fehlerhaft ist, oder nachdem ein UPDATE-Vorgang ausgeführt wurde. |
0X10 | LOCK | Bewirkt, dass eine SQL Server-U-Sperre auf der Seite mit der angegebenen Zeile abgerufen wird. Diese Sperre ist mit S-Sperren kompatibel, jedoch nicht mit X-Sperren oder anderen U-Sperren. Kann verwendet werden, um eine kurzfristige Sperre zu implementieren. |
0X20 | SETPOSITION | Wird nur verwendet, wenn das Programm eine nachfolgende SQL Server-Anweisung mit DELETE- oder UPDATE-Anweisung ausstellen wird. |
0X40 | ABSOLUTE | Kann nur in Verbindung mit UPDATE oder DELETE verwendet werden. ABSOLUTE wird nur mit KEYSET-Cursorn 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 Keyset 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 der Cursor im Fetchpuffer verwendet, aktualisiert oder löscht.
Hinweis
Weder dieser Wert noch die über sp_cursor ausgeführten Update- oder Löschvorgänge wirken sich auf den Ausgangspunkt eines Abrufvorgangs RELATIVE, NEXT oder PREVIOUS aus.
rownum ist ein erforderlicher Parameter, der einen Int-Eingabewert aufruft.
1
Gibt die erste Zeile im Fetchpuffer an.
2
Gibt die zweite Zeile im Fetchpuffer an.
3, 4, 5
Gibt die dritte Zeile an usw.
n
Gibt die n-te Zeile im Fetchpuffer an.
0
Gibt alle Zeilen im Fetchpuffer an.
Hinweis
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 oder mehrdeutige Spaltennamen umfasst, werden vom Wertparameter zurückgegeben. Wenn keine bestimmte Tabelle festgelegt wird, wird die erste Tabelle in der FROM-Klausel als Standard verwendet. Tabelle ist ein optionaler Parameter, der einen Zeichenfolgeneingabewert erfordert. Die Zeichenfolge kann als beliebiges Zeichen oder UNICODE-Datentyp angegeben werden. Tabelle kann ein mehrteiliger Tabellenname sein.
value
Wird zum Einfügen oder Aktualisieren von Werten verwendet. Der Wertzeichenfolgenparameter wird nur mit UPDATE- und INSERT-Optype-Werten verwendet. Die Zeichenfolge kann als beliebiges Zeichen oder UNICODE-Datentyp angegeben werden.
Hinweis
Die Parameternamen für den Wert können vom Benutzer zugewiesen werden.
Rückgabecodewerte
Bei Verwendung eines RPC gibt ein positionierter DELETE- oder UPDATE-Vorgang mit einer Puffernummer 0 eine DONE-Nachricht mit einer Zeilenanzahl von 0 (Fehler) oder 1 (Erfolg) für jede Zeile im Abrufpuffer zurück.
Hinweise
optype-Parameter
Mit Ausnahme der Kombinationen von SETPOSITION mit UPDATE, DELETE, REFRESH oder LOCK; oder ABSOLUTE mit UPDATE oder DELETE schließen sich die Optype-Werte 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 bei UPDATE angegeben. Wenn eine der erforderlichen Spalten nicht eingeschlossen wird, tritt ein INSERT-Fehler auf.
- Weder der SETPOSITION-Wert noch die über die sp_cursor-Schnittstelle ausgeführten Update- oder Löschvorgänge wirken sich auf den Ausgangspunkt eines Abrufvorgangs RELATIVE, NEXT oder PREVIOUS aus. Jede Zahl, die keine Zeile im Fetchpuffer angibt, führt dazu, dass die Position auf 1 festgelegt und kein Fehler zurückgegeben wird. Nachdem SETPOSITION ausgeführt wurde, bleibt die Position bis zum nächsten sp_cursorfetch Vorgang, T-SQL FETCH-Vorgang oder sp_cursor SETPOSITION-Vorgang über denselben Cursor wirksam. Durch einen nachfolgenden sp_cursorfetch-Vorgang wird die Cursorposition auf die erste Zeile im neuen Fetchpuffer festgelegt, während sich andere Cursoraufrufe nicht auf den Wert der Position auswirken. SETPOSITION kann von einer OR-Klausel mit REFRESH, UPDATE, DELETE oder LOCK verknüpft werden, 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. Nachdem die Position festgelegt wurde, bleibt sie so lange wirksam, bis der nächste sp_cursorfetch-Vorgang, T-SQL FETCH-Vorgang oder sp_cursor SETPOSITION-Vorgang für den gleichen Cursor ausgeführt wird.
SETPOSITION kann von einer OR-Klausel mit REFRESH, UPDATE, DELETE oder LOCK verknüpft werden, um die Cursorposition auf die letzte geänderte Zeile festzulegen.
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 bei SCROLL_LOCKS-Cursorn eine Sperre für die angegebene Zeile unabhängig verwaltet werden muss (dies kann über eine Transaktion erfolgen). Bei OPTIMISTIC-Cursorn müssen Sie zuvor die Zeile abgerufen haben, um diesen Vorgang auszuführen.
table-Parameter
Wenn der Optype-Wert UPDATE oder INSERT ist und eine vollständige Aktualisierungs- oder Einfüge-Anweisung als Wertparameter übermittelt wird, wird der für die Tabelle angegebene Wert ignoriert.
Hinweis
Bei Sichten kann nur eine zur Sicht gehörige Tabelle geändert werden. Die Werteparameterspaltennamen müssen die Spaltennamen in der Ansicht widerspiegeln, der Tabellenname kann jedoch die der zugrunde liegenden Basistabelle sein (in diesem Fall ersetzt sp_cursor den Ansichtsnamen).
value-Parameter
Es gibt zwei Alternativen zu den Regeln für die Verwendung von Werten , wie weiter oben im Abschnitt "Argumente" angegeben:
Sie können einen Vorstift '@' für den Namen der Spalte in der Auswahlliste für alle benannten Wertparameter verwenden. Ein Vorteil dabei ist, dass möglicherweise keine Datenkonvertierung erforderlich ist.
Verwenden Sie einen Parameter, um entweder eine vollständige UPDATE- oder INSERT-Anweisung zu übermitteln, oder verwenden Sie mehrere Parameter, um Teile einer UPDATE- oder INSERT-Anweisung zu übermitteln, die SQL Server dann in eine vollständige Anweisung einfügt. Beispiele dafür finden Sie im Abschnitt "Beispiele" weiter unten in diesem Thema.
Beispiele
Alternative Verwendung des value-Parameters
Für UPDATE:
Wenn ein einzelner Parameter verwendet wird, kann eine UPDATE-Anweisung mit der folgenden Syntax übermittelt werden:
[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,...n]
Hinweis
Wenn der Name> der UPDATE-Tabelle <angegeben ist, werden alle für den Tabellenparameter angegebenen Werte ignoriert.
Wenn mehrere Parameter verwendet werden, muss der erste Parameter eine Zeichenfolge in der folgenden Form sein:
[ SET ] <column name> = expression [,...n]
und die nachfolgenden Parameter müssen die folgende Form aufweisen:
<column name> = expression [,...n]
In diesem Fall ist der <Tabellenname> in der konstruierten Update-Anweisung der vom Tabellenparameter angegebene oder standardmäßige.
Für INSERT:
Wenn ein einzelner Parameter verwendet wird, kann eine INSERT-Anweisung mit der folgenden Syntax übermittelt werden:
[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,...n] )
Hinweis
Wenn der NAME der INSERT-Tabelle <>angegeben ist, werden alle für den Tabellenparameter angegebenen Werte ignoriert.
Wenn mehrere Parameter verwendet werden, muss der erste Parameter eine Zeichenfolge in der folgenden Form sein:
[ VALUES ( ] <expression> [,...n]
und die nachfolgenden Parameter müssen die folgende Form aufweisen:
expression [,...n]
es sei denn, VALUES wurde angegeben; in diesem Fall muss der letzte Ausdruck mit einer abschließenden ")" enden. In diesem Fall ist der <Tabellenname> in der konstruierten UPDATE-Anweisung die vom Tabellenparameter angegebene oder standardmäßige.
Hinweis
Es ist möglich, einen Parameter als benannten Parameter zu übermitteln, d. h. "@VALUES
". In diesem Fall können keine weiteren benannten Parameter verwendet werden.
Weitere Informationen
sp_cursoropen (Transact-SQL)
sp_cursorfetch (Transact-SQL)
Gespeicherte Systemprozeduren (Transact-SQL)
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Einreichen und Feedback anzeigen für