sp_cursorfetch (Transact-SQL)

Gilt für: SQL Server (alle unterstützten Versionen)

Ruft einen Puffer mit mindestens einer Zeile aus der Datenbank ab. Die Gruppe der Zeilen in diesem Puffer wird als Abrufpuffer des Cursors bezeichnet. sp_cursorfetch wird aufgerufen, indem die ID = 7 in einem tabellarischen Datenstrompaket (TDS) angegeben wird.

ThemenlinksymbolTransact-SQL-Syntaxkonventionen

Syntax

  
sp_cursorfetch cursor  
    [ , fetchtype[ , rownum [ , nrows] ]]   

Argumente

Cursor
Ist ein Handlewert, der von SQL Server generiert und von sp_cursoropen zurückgegeben wird. Cursor ist ein erforderlicher Parameter, der einen Int-Eingabewert aufruft. Weitere Informationen finden Sie im Abschnitt mit den Hinweisen weiter unten in diesem Thema.

fetchtype
Gibt an, welcher Cursorpuffer abgerufen werden soll. fetchtype ist ein optionaler Parameter, der einen der folgenden ganzzahligen Eingabewerte erfordert.

Wert Name BESCHREIBUNG
0x0001 FIRST Ruft den ersten Puffer von Heftzeilen ab. Wenn Klammern gleich 0 sind, wird der Cursor vor dem Ergebnissatz positioniert, und es werden keine Zeilen zurückgegeben.
0x0002 NEXT Ruft den nächsten Puffer von Heftzeilen ab.
0x0004 PREV Ruft den vorherigen Puffer von Heftzeilen ab.

Hinweis: Verwenden von PREV für einen FORWARD_ONLY Cursor gibt eine Fehlermeldung zurück, da FORWARD_ONLY nur den Bildlauf in einer Richtung unterstützt.
0x0008 LAST Ruft den letzten Puffer von Heftzeilen ab. Wenn Nrows gleich 0 sind, wird der Cursor nach dem Ergebnissatz positioniert, und es werden keine Zeilen zurückgegeben.

Hinweis: Verwenden von LAST für einen FORWARD_ONLY Cursor gibt eine Fehlermeldung zurück, da FORWARD_ONLY nur das Scrollen in einer Richtung unterstützt.
0x10 ABSOLUTE Ruft einen Puffer von Zeilen ab, die mit der Zeilenumzeile beginnen.

Hinweis: Verwenden von ABSOLUTE für einen DYNAMISCHEn Cursor oder einen FORWARD_ONLY Cursor gibt eine Fehlermeldung zurück, da FORWARD_ONLY nur den Bildlauf in einer Richtung unterstützt.
0x20 RELATIVE Ruft den Puffer der Zeilen ab, die mit der Zeile beginnen, die als Zeilenumwert von Zeilen aus der ersten Zeile im aktuellen Block angegeben wird. In diesem Fall kann zeilennum eine negative Zahl sein.

Hinweis: Verwenden von RELATIVE für einen FORWARD_ONLY Cursor gibt eine Fehlermeldung zurück, da FORWARD_ONLY nur den Bildlauf in einer Richtung unterstützt.
0x80 REFRESH Füllt den Puffer anhand zugrunde liegender Tabellen auf.
0x100 INFO Ruft Informationen zum Cursor ab. Diese Informationen werden mithilfe der Zeilenum- und Nrows-Parameter zurückgegeben. Wenn INFO angegeben wird, werden zeilenume und Nrows zu Ausgabeparametern .
0x200 PREV_NOADJUST Wird analog zu PREV verwendet. Wenn der Anfang des Resultsets vorzeitig gefunden wird, können die Ergebnisse jedoch variieren.
0x400 SKIP_UPDT_CNCY Muss mit einem der anderen Abruftypwerte verwendet werden, außer für INFO.

Hinweis

Der Wert 0x40 wird nicht unterstützt.

Weitere Informationen finden Sie im Abschnitt mit den Hinweisen weiter unten in diesem Thema.

Rownum
Ist ein optionaler Parameter, der verwendet wird, um die Zeilenposition für die ABSOLUTE und INFO-Abruftypwerte anzugeben, indem nur ganzzahlige Werte für Eingabe oder Ausgabe oder beides verwendet werden. rownum dient als Zeilenversatz für den Abrufentyp-Bitwert RELATIV. rownum wird für alle anderen Werte ignoriert. Weitere Informationen finden Sie im Abschnitt mit den Hinweisen weiter unten in diesem Thema.

Nrows
Ein optionaler Parameter, mit dem die Anzahl der abzurufenden Zeilen angegeben wird. Wenn Nrows nicht angegeben werden, beträgt der Standardwert 20 Zeilen. Wenn Sie die Position ohne Zurückgeben von Daten festlegen möchten, geben Sie einen Wert von 0 an. Beim Anwenden von Nrows auf die Abruftyp-INFO-Abfrage wird die Gesamtanzahl der Zeilen in dieser Abfrage zurückgegeben.

Hinweis

Nrows werden vom REFRESH-Abruftyp-Bitwert ignoriert.

Weitere Informationen finden Sie im Abschnitt mit den Hinweisen weiter unten in diesem Thema.

Rückgabecodewerte

In den folgenden Tabellen sind die Werte dargestellt, die bei Angabe des Bitwerts INFO zurückgegeben werden können.

Hinweis

: Wenn keine Zeilen zurückgegeben werden, bleiben die Pufferinhalte wie sie waren.

<Rownum> Festlegen auf
Falls nicht geöffnet 0
Falls vor dem Resultset positioniert 0
Falls nach dem Resultset positioniert -1
Für KEYSET- und STATIC-Cursor Die absolute Zeilennummer der aktuellen Position im Resultset
Für DYNAMIC-Cursor 1
Für ABSOLUTE -1 gibt die letzte Zeile in einem Satz zurück.

-2 gibt die vorletzte Zeile in einem Satz zurück usw.

Hinweis: Wenn mehr als eine Zeile angefordert wird, die in diesem Fall abgerufen werden soll, werden die letzten beiden Zeilen des Ergebnissatzes zurückgegeben.
<Nrows> Festlegen auf
Falls nicht geöffnet 0
Für KEYSET- und STATIC-Cursor Normalerweise die aktuelle Keysetgröße.

-m , wenn sich der Cursor in asynchroner Erstellung mit m-Zeilen befindet, die an diesem Punkt gefunden wurden.
Für DYNAMIC-Cursor -1

Hinweise

cursor-Parameter

Bevor Abrufvorgänge stattgefunden haben, befindet sich die Standardposition eines Cursors vor der ersten Zeile des Resultsets.

fetchtype-Parameter

Außer SKIP_UPD_CNCY sind die Abruftypwerte gegenseitig ausschließen.

Wenn SKIP_UPDT_CNCY angegeben wird, werden die timestamp-Spaltenwerte nicht in die Keysettabelle geschrieben, wenn eine Zeile abgerufen oder aktualisiert wird. Wenn die Keysetzeile aktualisiert wird, wird für die Werte der timestamp-Spalten der vorherige Wert beibehalten. Wenn die Keysetzeile eingefügt wird, wird die Definition der Werte für die timestamp-Spalten aufgehoben.

Bei KEYSET-Cursorn bedeutet dies, dass die Werte der Keysettabelle während des letzten durchgehenden FETCH-Vorgangs festgelegt wurden, falls einer ausgeführt wurde. Andernfalls werden die Werte während der Auffüllung festgelegt.

Bei DYNAMIC-Cursorn bedeutet dies, dass die gleichen Ergebnisse erzeugt werden wie bei KEYSET, wenn der SKIP-Vorgang mit einer Aktualisierung ausgeführt wird. Bei jedem anderen Fetchtyp wird die Keysettabelle abgeschnitten. Dies bedeutet, dass die Zeilen eingefügt werden und die Definition der Werte für die timestamp-Spalte(n) aufgehoben wird. Wenn Sie sp_cursorfetch für DYNAMIC-Cursor ausführen, sollten Sie SKIP_UPDT_CNCY bei jedem anderen Vorgang als REFRESH folglich vermeiden.

Wenn ein Abrufvorgang fehlerhaft ist, weil die angeforderte Cursorposition außerhalb des Resultsets liegt, wird die Cursorposition unmittelbar nach der letzten Zeile festgelegt. Wenn ein Abrufvorgang fehlerhaft ist, weil die angeforderte Cursorposition vor dem Resultset liegt, wird die Cursorposition vor der ersten Zeile festgelegt.

rownum-Parameter

Wenn Sie zeilennum verwenden, wird der Puffer mit der angegebenen Zeile gefüllt.

Der Abruftypwert ABSOLUTE bezieht sich auf die Position von Rownum innerhalb des gesamten Ergebnissatzes. Eine negative Zahl mit ABSOLUTE gibt an, dass bei dem Vorgang Zeilen vom Ende des Resultsets gezählt werden.

Der relative Abruftypwert bezieht sich auf die Position der Zeilenum in Bezug auf die Position des Cursors am Anfang des aktuellen Puffers. Eine negative Zahl mit RELATIVE gibt an, dass sich der Cursor von der aktuellen Cursorposition rückwärts bewegt.

nrows-Parameter

Die Abruftypwerte AKTUALISIEREN und INFO ignorieren diesen Parameter.

Wenn Sie einen Abruftypwert von FIRST angeben, der einen Nrowwert von 0 aufweist, wird der Cursor vor dem Ergebnissatz positioniert, der keine Zeilen im Abrufpuffer aufweist.

Wenn Sie einen Abruftypwert von LAST angeben, der einen Nrow-Wert von 0 aufweist, wird der Cursor nach dem Ergebnissatz positioniert, der keine Zeilen im aktuellen Abrufpuffer aufweist.

Für die Abruftypwerte von NEXT, PREV, ABSOLUTE, RELATIVE und PREV_NOADJUST ist ein Nrowwert von 0 ungültig.

Überlegungen zu RPC

Der RPC-Rückgabestatus gibt an, ob der KEYSET_SIZE-Parameter abgeschlossen ist, d. h., ob das Keyset oder die temporäre Tabelle asynchron aufgefüllt wird.

Der RPC-Statusparameter wird auf einen der Werte in der folgenden Tabelle festgelegt.

Wert BESCHREIBUNG
0 Die Prozedur wurde erfolgreich ausgeführt.
0x0001 Fehler bei der Prozedur.
0x0002 Ein Abruf in einer negativen Richtung hätte die Cursorposition auf den Anfang des Resultsets festgelegt, wenn der Abruf logisch vor den Ergebnissen erfolgt wäre.
0x10 Ein Schnellzeiger wurde automatisch geschlossen.

Die Zeilen werden als typisches Resultset zurückgegeben: Spaltenformat (0x2a), Zeilen (0xd1) gefolgt vom fertigen Resultset (0xfd). Metadatentoken werden im gleichen Format gesendet wie für sp_cursoropen angegeben: 0x81, 0xa5 und 0xa4 für SQL Server 7.0-Benutzer usw. Die Zeilenstatusindikatoren werden ähnlich dem BROWSE-Modus als ausgeblendete Spalten am Ende jeder Zeile mit dem Spaltennamen "rowstat" und dem Datentyp INT4 gesendet. Diese rowstat-Spalte verfügt über einen der Werte aus der folgenden Tabelle.

Wert BESCHREIBUNG
0x0001 FETCH_SUCCEEDED
0x0002 FETCH_MISSING

Weil das TDS-Protokoll keine Möglichkeit bietet, die nachfolgende Statusspalte ohne die vorherigen Spalten zu senden, werden Pseudodaten für fehlende Zeilen gesendet (auf NULL festlegbare Felder sind auf NULL, Felder fester Datenlänge auf 0 (leer) oder ggf. den Standardwert für diese Spalte festgelegt).

Die DONE-Zeilenanzahl ist immer 0 (null). Die DONE-Meldung enthält die tatsächliche Zeilenanzahl des Resultsets, und Fehler- oder Informationsmeldungen können zwischen allen TDS-Meldungen angezeigt werden.

Damit die Metadaten zur SELECT-Liste des Cursors im TDS-Datenstrom zurückgegeben werden, legen Sie das RPC RETURN_METADATA-Eingabeflag auf 1 fest.

Beispiele

A. Ändern einer Cursorposition mithilfe von PREV

Angenommen, der Cursor h2 würde ein Resultset erzeugen, das über den folgenden Inhalt mit der angegebenen aktuellen Position verfügt:

row 1 contents      
row 2 contents  
row 3 contents  
row 4 contents  <-- current position  
row 5 contents   
row 6 contents  

Als Nächstes würde ein sp_cursorfetch PREV mit einem Klammerwert von 5 den Cursor zwei Zeilen vor der ersten Zeile des Ergebnissatzes positionieren. In diesen Fällen wird der Cursor so eingerichtet, dass er an der ersten Zeile beginnt und die angeforderte Zeilenanzahl zurückgibt. Häufig bedeutet dies, dass er Zeilen aus dem PRIOR-Fetchpuffer zurückgibt.

Hinweis

Genau in diesem Fall wird der RPC-Statusparameter auf 2 festgelegt.

B. Zurückgeben von weniger Zeilen als PREV mithilfe von PREV_NOADJUST

PREV_NOADJUST schließt nie Zeilen ein, die sich an oder nach der aktuellen Cursorposition im Block zurückgegebener Zeilen befinden. In Fällen, in denen PREV Zeilen nach der aktuellen Position zurückgibt, gibt PREV_NOADJUST weniger Zeilen zurück als in Nrows angefordert. Bei der aktuellen Position in Beispiel A oben ruft (h2, 4, 1, 5) die folgenden Zeilen ab, wenn PREV angegeben ist:

row1 contents   
row2 contents  
row3 contents  
row4 contents  
row5 contents  

Wenn jedoch PREV_NOADJUST angewendet wird, ruft (h2, 512, 6, 5) nur die folgenden Zeilen ab:

row1 contents   
row2 contents  
row3 contents   

Weitere Informationen

sp_cursoropen (Transact-SQL)
Gespeicherte Systemprozeduren (Transact-SQL)