sp_cursorfetch (Transact-SQL)

Gilt für:SQL Server

Ruft einen Puffer mit mindestens einer Zeile aus der Datenbank ab. Die Gruppe von Zeilen in diesem Puffer wird als Abrufpuffer des Cursors bezeichnet. sp_cursorfetch wird durch Angabe der ID = 7 in einem TDS-Paket (Tabellar Data Stream) aufgerufen.

Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

Cursor
Ist ein von SQL Server generierter und von sp_cursoropen zurückgegebener Handle-Wert. 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 NS-Zeilen ab. Wenn nows gleich 0 ist, wird der Cursor vor dem Resultset positioniert, und es werden keine Zeilen zurückgegeben.
0x0002 NEXT Ruft den nächsten Puffer von NS-Zeilen ab.
0x0004 PREV Ruft den vorherigen Puffer von NS-Zeilen ab.

Hinweis: Die Verwendung von PREV für einen FORWARD_ONLY Cursor gibt eine Fehlermeldung zurück, da FORWARD_ONLY nur den Bildlauf in eine Richtung unterstützt.
0x0008 LAST Ruft den letzten Puffer von NS-Zeilen ab. Wenn NNNS gleich 0 ist, wird der Cursor nach dem Resultset positioniert, und es werden keine Zeilen zurückgegeben.

Hinweis: Die Verwendung von LAST für einen FORWARD_ONLY Cursor gibt eine Fehlermeldung zurück, da FORWARD_ONLY nur den Bildlauf in eine Richtung unterstützt.
0x10 ABSOLUTE Ruft einen Puffer von Zeilen ab , die mit der Zeile rownum beginnen.

Hinweis: Die Verwendung von ABSOLUTE für einen DYNAMISCHEn Cursor oder einen FORWARD_ONLY Cursor gibt eine Fehlermeldung zurück, da FORWARD_ONLY nur das Scrollen in eine Richtung unterstützt.
0x20 RELATIVE Ruft den Puffer von nows-Zeilen ab, beginnend mit der Zeile, die als rownum-Wert von Zeilen aus der ersten Zeile im aktuellen Block angegeben wird. In diesem Fall kann rownum eine negative Zahl sein.

Hinweis: Die Verwendung von RELATIVE für einen FORWARD_ONLY Cursor gibt eine Fehlermeldung zurück, da FORWARD_ONLY nur den Bildlauf in eine 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 Parameter rownum und nrows zurückgegeben. Daher werden zeilenum und nows beim Angeben von INFO 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 Fetchtype-Werte mit Ausnahme von INFO verwendet werden.

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 Abruftypwerte ABSOLUTE und INFO anzugeben, indem nur ganzzahlige Werte für die Eingabe oder Ausgabe oder beides verwendet werden. rownum dient als Zeilenoffset für den Fetchtype-Bitwert RELATIVE. 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 keine Nows angegeben werden, beträgt der Standardwert 20 Zeilen. Um die Position festzulegen, ohne Daten zurückzugeben, geben Sie den Wert 0 an. Wenn nows auf die INFO-Abfrage "fetchtype " angewendet wird, gibt sie die Gesamtanzahl der Zeilen in dieser Abfrage zurück.

Hinweis

nrows wird vom REFRESH-Fetchtype-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, bleibt der Pufferinhalt unverändert.

<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 in diesem Fall mehr als eine Zeile abgerufen werden soll, werden die letzten beiden Zeilen des Resultsets 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 der asynchronen Erstellung mit m-Zeilen befindet, die bis zu diesem Punkt gefunden wurden.
Für DYNAMIC-Cursor -1

Bemerkungen

cursor-Parameter

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

fetchtype-Parameter

Mit Ausnahme von SKIP_UPD_CNCY schließen sich die Fetchtype-Werte gegenseitig aus.

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 rownum verwenden, wird der Puffer beginnend mit der angegebenen Zeile gefüllt.

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

Der Fetchtype-Wert RELATIVE bezieht sich auf die Position der Rownum im Verhältnis zur 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 Fetchtype-Werte REFRESH und INFO ignorieren diesen Parameter.

Wenn Sie einen Fetchtype-Wert von FIRST angeben, der den now-Wert 0 aufweist, wird der Cursor vor dem Resultset positioniert, das keine Zeilen im Abrufpuffer enthält.

Wenn Sie den Fetchtype-Wert LAST angeben, der den Leerwert 0 aufweist, wird der Cursor nach dem Resultset positioniert, das keine Zeilen im aktuellen Abrufpuffer enthält.

Für die Fetchtype-Werte von NEXT, PREV, ABSOLUTE, RELATIVE und PREV_NOADJUST ist der Nullwert 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 Schneller Vorwärtscursor 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, der den Nativwert 5 aufweist, den Cursor logisch zwei Zeilen vor der ersten Zeile des Resultsets 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 werden. 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)