sp_cursorfetch (Transact-SQL)
Gilt für: SQL Server
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 id = 7 in einem TDS-Paket (Tabellarischer Datenstrom) angegeben wird.
Transact-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 der Zeilen nrows ab. Wenn nrows 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 Zeilen nrows ab. |
0x0004 | PREV | Ruft den vorherigen Puffer der Zeilen nrows 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 der Zeilen nrows ab. Wenn nrows 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 Zeilenumzeile beginnen. Hinweis: Die Verwendung von ABSOLUTE für einen DYNAMISCHEn Cursor oder ein FORWARD_ONLY Cursor gibt eine Fehlermeldung zurück, da FORWARD_ONLY nur den Bildlauf in eine Richtung unterstützt. |
0x20 | RELATIVE | Ruft den Puffer der Zeilen nrows ab, beginnend mit der Zeile, die als Zeilenumwert der Zeilen aus der ersten Zeile im aktuellen Block angegeben ist. 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. Wenn INFO angegeben wird, werden zeilenum 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 Fetchtype-Werte verwendet werden, mit Ausnahme von 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 Werte absoluter und INFO-Abruftypen anzugeben, indem nur ganzzahlige Werte für Eingabe oder Ausgabe verwendet werden, oder beides. 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.
Nr.
Ein optionaler Parameter, mit dem die Anzahl der abzurufenden Zeilen angegeben wird. Wenn keine Nr. angegeben ist, beträgt der Standardwert 20 Zeilen. Um die Position festzulegen, ohne Daten zurückzugeben, geben Sie einen Wert von 0 an. Wenn nrows auf die Fetchtype INFO-Abfrage angewendet wird, wird die Gesamtanzahl der Zeilen in dieser Abfrage zurückgegeben.
Hinweis
Nrows werden 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, bleiben die Pufferinhalte wie vorhanden.
<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 mehrere Zeilen abgerufen werden sollen, werden die letzten beiden Zeilen des Resultsets zurückgegeben. |
<Nr.> | 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 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
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 von 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 einen Nrow-Wert von 0 aufweist, wird der Cursor vor dem Resultset positioniert, das keine Zeilen im Abrufpuffer enthält.
Wenn Sie einen Fetchtype-Wert von LAST angeben, der einen Nrow-Wert von 0 aufweist, wird der Cursor nach dem Resultset positioniert, das keine Zeilen im aktuellen Abrufpuffer enthält.
Für die Abruftypwerte von NEXT, PREV, ABSOLUTE, RELATIVE und PREV_NOADJUST ist ein Nrow-Wert 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 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 positioniert ein sp_cursorfetch PREV mit einem Nrows-Wert von 5 den Cursor zwei Zeilen vor der ersten Zeile des Resultsets. 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 als angefordert in Nrows zurück. Aufgrund der aktuellen Position in Beispiel A, wenn PREV angewendet wird, ruft sp_cursorfetch(h2, 4, 1, 5) die folgenden Zeilen ab:
row1 contents
row2 contents
row3 contents
row4 contents
row5 contents
Wenn PREV_NOADJUST angewendet wird, ruft sp_cursorfetch(h2, 512, 6, 5) jedoch nur die folgenden Zeilen ab:
row1 contents
row2 contents
row3 contents
Weitere Informationen
sp_cursoropen (Transact-SQL)
Gespeicherte Systemprozeduren (Transact-SQL)
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für