Freigeben über


sp_cursor (Transact-SQL)

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 Tabular Data Stream-Paket (TDS) angegeben wird.

Themenlink (Symbol) 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 erfordert. cursor ist der Wert von handle, der von SQL Server generiert und von sp_cursoropen zurückgegeben wird.

  • 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. Die in rownum angegebenen Zeilen werden erneut abgerufen und aktualisiert.

    0x0002

    DELETE

    Wird zum Löschen mindestens einer Zeile im Fetchpuffer verwendet. Die in rownum angegebenen Zeilen werden erneut abgerufen und gelöscht.

    0X0004

    INSERT

    Fügt Daten ein, ohne eine INSERT-Anweisung in SQL 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 für die Seite abgerufen wird, in der die angegebene Zeile enthalten ist. 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, von SQL Server positionierte DELETE-Anweisung oder UPDATE-Anweisung ausgibt.

    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).

    HinweisHinweis

    Wenn ABSOLUTE für eine Zeile im Keyset angegeben wird, die nicht abgerufen wurde, kann ein Fehler bei der Parallelitätsprüfung auftreten und das Rückgabeergebnis nicht gewährleistet werden.

  • rownum
    Gibt an, welche Zeilen der Cursor im Fetchpuffer verwendet, aktualisiert oder löscht.

    HinweisHinweis

    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 erfordert.

    • 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.

      HinweisHinweis

      Ist nur zur Verwendung mit den optype-Werten UPDATE, DELETE, REFRESH oder LOCK gültig.

  • table
    Tabellenname, der die Tabelle identifiziert, für die optype gilt, wenn die Cursordefinition einen Join einschließt oder mehrdeutige Spaltennamen vom value-Parameter zurückgegeben werden. Wenn keine bestimmte Tabelle festgelegt wird, wird die erste Tabelle in der FROM-Klausel als Standard verwendet. table ist ein optionaler Parameter, der eine Zeichenfolge als Eingabewert erfordert. Die Zeichenfolge kann als beliebiges Zeichen oder UNICODE-Datentyp angegeben werden. table kann ein mehrteiliger Tabellenname sein.

  • value
    Wird zum Einfügen oder Aktualisieren von Werten verwendet. Der value-Zeichenfolgenparameter wird nur mit dem optype-Wert UPDATE und INSERT verwendet. Die Zeichenfolge kann als beliebiges Zeichen oder UNICODE-Datentyp angegeben werden.

    HinweisHinweis

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

Rückgabecodewerte

Bei Verwendung eines Remoteprozeduraufrufs (Remote Procedure Call, RPC) gibt ein positionierter DELETE-Vorgang oder UPDATE-Vorgang mit der Puffernummer 0 eine DONE-Meldung mit dem rowcount-Wert 0 (Fehler) oder 1 (Erfolg) für jede Zeile im Fetchpuffer zurück.

Hinweise

optype-Parameter

Mit Ausnahme der Kombinationen von SETPOSITION mit UPDATE, DELETE, REFRESH oder LOCK bzw. ABSOLUTE mit UPDATE oder DELETE schließen sich die optype -Werte gegenseitig aus.

Die SET-Klausel des UPDATE-Werts wird mithilfe des value-Parameters erstellt.

Ein Vorteil bei der Verwendung des optype-Werts INSERT liegt darin, dass Sie bei Einfügevorgängen die Konvertierung von Nicht-Zeichen-Datentypen in das Zeichenformat 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 so lange wirksam, bis der nächste sp_cursorfetch-Vorgang, T-SQL-FETCH-Vorgang oder sp_cursor-SETPOSITION-Vorgang über den gleichen Cursor ausgeführt wird. 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 Fetchpuffer nicht über den rownum-Parameter angegeben wird, wird die Position auf 1 festgelegt und kein Fehler zurückgegeben. Nachdem die Position festgelegt wurde, bleibt sie so lange wirksam, bis der nächste sp_cursorfetch, 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

Der rownum-Parameter kann als Zeilennummer innerhalb des Keysets anstatt als Zeilennummer innerhalb des Fetchpuffers interpretiert werden, wenn er angegeben wird. 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 lautet und eine vollständige UPDATE-Anweisung oder INSERT-Anweisung als value-Parameter übermittelt wird, wird der für table angegebene Wert ignoriert.

HinweisHinweis

Bei Sichten kann nur eine zur Sicht gehörige Tabelle geändert werden. Die Spaltennamen des value-Parameters müssen den Spaltennamen der Sicht entsprechen, der Tabellenname kann jedoch dem Namen der zugrunde liegenden Basistabelle entsprechen (wobei der Name der Sicht durch sp_cursor ersetzt wird).

value-Parameter

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

  1. Sie können einen Namen verwenden, bei dem für jeden benannten value-Parameter dem Namen der Spalte in der SELECT-Liste '@' vorangestellt wird. Ein Vorteil dabei ist, dass möglicherweise keine Datenkonvertierung erforderlich ist.

  2. Verwenden Sie einen Parameter, um eine vollständige UPDATE-Anweisung oder INSERT-Anweisung zu übermitteln, oder verwenden Sie mehrere Parameter, um Teile einer UPDATE-Anweisung oder INSERT-Anweisung zu übermitteln, die von SQL Server anschließend in eine vollständige Anweisung integriert werden. 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]

HinweisHinweis

Wenn UPDATE <Tabellenname> angegeben wird, wird jeder für den table-Parameter angegebene Wert 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 entspricht der <Tabellenname> in der erstellten UPDATE-Anweisung dem vom table-Parameter angegebenen oder standardmäßig verwendeten Tabellennamen.

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] )

HinweisHinweis

Wenn INSERT <table name> angegeben wird, werden alle für den table-Parameter 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. Hierbei entspricht der <table name> in der erstellten UPDATE-Anweisung dem vom table-Parameter angegebenen oder standardmäßig verwendeten Tabellennamen.

HinweisHinweis

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.

Siehe auch

Verweis

sp_cursoropen (Transact-SQL)

sp_cursorfetch (Transact-SQL)

Gespeicherte Systemprozeduren (Transact-SQL)