sp_cursorfetch (Transact-SQL)
Si applica a: SQL Server
Recupera un buffer di una o più righe dal database. Il gruppo di righe in questo buffer è denominato buffer di recupero del cursore. sp_cursorfetch
viene richiamato specificando ID = 7
in un pacchetto TDS (Tabular Data Stream).
Convenzioni relative alla sintassi Transact-SQL
Sintassi
sp_cursorfetch cursor
[ , fetchtype [ , rownum [ , nrows ] ] ]
[ ; ]
Argomenti
cursor
Valore handle generato da SQL Server e restituito da sp_cursoropen
. cursor è un parametro obbligatorio che chiama per un valore di input int . Per altre informazioni, vedere la sezione Osservazioni.
fetchtype
Specifica il buffer del cursore da recuperare. fetchtype è un parametro facoltativo che richiede uno dei valori di input integer seguenti.
valore | Nome | Descrizione |
---|---|---|
0x0001 |
FIRST |
Recupera il primo buffer di righe di rows . Se nrows è uguale a 0, il cursore viene posizionato prima del set di risultati e non vengono restituite righe. |
0x0002 |
NEXT |
Recupera il buffer successivo di righe di rows . |
0x0004 |
PREV |
Recupera il buffer precedente di righe di rows . Nota: l'uso di PREV per un cursore restituisce un FORWARD_ONLY messaggio di errore perché FORWARD_ONLY supporta solo lo scorrimento in una direzione. |
0x0008 |
LAST |
Recupera l'ultimo buffer di righe di rows . Se nrows è uguale a 0, il cursore viene posizionato dopo il set di risultati e non vengono restituite righe. Nota: l'uso di LAST per un cursore restituisce un FORWARD_ONLY messaggio di errore perché FORWARD_ONLY supporta solo lo scorrimento in una direzione. |
0x10 |
ABSOLUTE |
Recupera un buffer di righe che iniziano con la riga rownum . Nota: l'uso di ABSOLUTE per un DYNAMIC cursore o un FORWARD_ONLY cursore restituisce un messaggio di errore perché FORWARD_ONLY supporta solo lo scorrimento in una direzione. |
0x20 |
RELATIVE |
Recupera il buffer di righe di rows a partire dalla riga specificata come valore rownum delle righe della prima riga del blocco corrente. In questo caso, rownum può essere un numero negativo. Nota: l'uso di RELATIVE per un cursore restituisce un FORWARD_ONLY messaggio di errore perché FORWARD_ONLY supporta solo lo scorrimento in una direzione. |
0x80 |
REFRESH |
Reinserisce nel buffer dati delle tabelle sottostanti. |
0x100 |
INFO |
Recupera informazioni sul cursore. Queste informazioni vengono restituite usando i parametri rownum e nrows . Pertanto, quando INFO viene specificato, rownum e nrows diventano parametri di output. |
0x200 |
PREV_NOADJUST |
Viene usato come PREV . Se tuttavia l'inizio del set di risultati viene raggiunto prima del previsto, i risultati potrebbero variare. |
0x400 |
SKIP_UPDT_CNCY |
Deve essere usato con uno degli altri valori fetchtype , ad eccezione di INFO . |
Nota
Non è disponibile alcun supporto per il valore 0x40
.
Per altre informazioni, vedere la sezione Osservazioni.
rownum
Parametro facoltativo utilizzato per specificare la posizione della riga per i ABSOLUTE
valori e INFO
fetchtype utilizzando solo valori integer per input o output o entrambi. rownum funge da offset di riga per il valore RELATIVE
di bit fetchtype . rownum viene ignorato per tutti gli altri valori. Per altre informazioni, vedere la sezione Osservazioni.
rows
Parametro facoltativo utilizzato per specificare il numero di righe da recuperare. Se non viene specificato nrows , il valore predefinito è 20 righe. Per impostare la posizione senza restituire dati, specificare il valore .0
Quando la query fetchtype INFO
viene applicata a nrows, restituisce il numero totale di righe nella query.
nrows viene ignorato dal REFRESH
valore di bit fetchtype . Per altre informazioni, vedere la sezione Osservazioni.
Valori del codice restituito
Quando si specifica il valore INFO
di bit , i valori che potrebbero essere restituiti vengono visualizzati nelle tabelle seguenti.
Se non vengono restituite righe, il contenuto del buffer rimane invariato.
<rownum> | Impostare su |
---|---|
Se non aperto | 0 |
Se posizionato prima del set di risultati | 0 |
Se posizionato dopo il set di risultati | -1 |
Per KEYSET i cursori e STATIC |
Numero di riga assoluto della posizione corrente nel set di risultati |
Per DYNAMIC i cursori |
1 |
Per ABSOLUTE |
-1 restituisce l'ultima riga di un set. -2 restituisce la penultima riga di un set e così via. Nota: se sono richieste più righe per il recupero in questo caso, vengono restituite le ultime due righe del set di risultati. |
<nrows> |
Impostare su |
---|---|
Se non aperto | 0 |
Per KEYSET i cursori e STATIC |
In genere la dimensione del keyset corrente.-m se il cursore è in fase di creazione asincrona con m righe trovate a questo punto. |
Per DYNAMIC i cursori |
-1 |
Osservazioni:
Parametro del cursore
Prima di qualsiasi operazione di recupero, la posizione predefinita di un cursore è prima della prima riga del set di risultati.
Parametro fetchtype
Ad eccezione di SKIP_UPD_CNCY
, i valori fetchtype si escludono a vicenda.
Quando SKIP_UPDT_CNCY
viene specificato, i valori di colonna timestamp non vengono scritti nella tabella keyset quando una riga viene recuperata o aggiornata. Se la riga di keyset viene aggiornata, i valori delle colonne timestamp rimangono inalterati. Se la riga di keyset viene inserita, i valori per le colonne timestamp non sono definiti.
Per KEYSET
i cursori, ciò significa che la tabella keyset ha i valori impostati durante l'ultimo nonskip FETCH
, se ne è stata eseguita una. In caso contrario, si tratta dei valori impostati durante la popolazione.
Per DYNAMIC
i cursori, ciò significa che se il skip viene eseguito con un aggiornamento, produce gli stessi risultati di KEYSET
. Per qualsiasi altro tipo di recupero, la tabella di keyset viene troncata. Ciò significa che le righe vengono inserite e i valori per le colonne timestamp non sono definiti. Pertanto, quando si esegue sp_cursorfetch
per DYNAMIC
i cursori, evitare di usare SKIP_UPDT_CNCY
per qualsiasi operazione diversa da REFRESH
.
Se un'operazione di recupero non riesce perché la posizione del cursore richiesta è oltre il set di risultati, la posizione del cursore viene impostata subito dopo l'ultima riga. Se un'operazione di recupero non riesce perché la posizione del cursore richiesta è prima del set di risultati, la posizione del cursore viene impostata prima della prima riga.
Parametro rownum
Quando si usa rownum, il buffer viene riempito a partire dalla riga specificata.
Il valore ABSOLUTE
fetchtype fa riferimento alla posizione di rownum all'interno dell'intero set di risultati. Un numero negativo con ABSOLUTE
specifica che l'operazione conta le righe dalla fine del set di risultati.
Il valore RELATIVE
fetchtype fa riferimento alla posizione di rownum in relazione alla posizione del cursore all'inizio del buffer corrente. Un numero negativo con RELATIVE
specifica che il cursore passa all'indietro dalla posizione corrente del cursore.
Parametro nrows
I valori REFRESH
fetchtype e INFO
ignorano questo parametro.
Quando si specifica un valore fetchtype pari FIRST
a 0, il cursore viene posizionato prima del set di risultati senza righe nel buffer di recupero.
Quando si specifica un valore fetchtype pari LAST
a 0, il cursore viene posizionato dopo il set di risultati che non contiene righe nel buffer di recupero corrente.
Per i valori fetchtype di NEXT
, PREV
ABSOLUTE
, RELATIVE
, e PREV_NOADJUST
, un valore nrow di 0
non è valido.
Considerazioni su RPC
Lo stato restituito RPC indica se il parametro keyset size è finale o meno; ovvero se il keyset o la tabella temporanea vengono popolati in modo asincrono.
Il parametro di stato di RPC viene impostato su uno dei valori mostrati nella tabella seguente.
valore | Descrizione |
---|---|
0 |
La routine è stata eseguita correttamente. |
0x0001 |
La routine non è riuscita. |
0x0002 |
Un recupero in direzione negativa ha impostato la posizione del cursore all'inizio del set di risultati, laddove logicamente il recupero avrebbe dovuto trovarsi prima dei risultati. |
0x10 |
Un cursore di avanzamento è stato chiuso automaticamente. |
Le righe vengono restituite come set di risultati tipico: formato di colonna (0x2a
), righe (0xd1
), seguito da DONE
(0xfd
). I token di metadati vengono inviati nello stesso formato specificato per sp_cursoropen
: 0x81
0xa5
e 0xa4
per gli utenti di SQL Server e così via. Gli indicatori di stato della riga vengono inviati come colonne nascoste, in modo simile alla BROWSE
modalità, alla fine di ogni riga con il nome della colonna rowstat e il tipo di dati int. Questa colonna rowstat include uno dei valori illustrati nella tabella seguente.
valore | Descrizione |
---|---|
0x0001 |
FETCH_SUCCEEDED |
0x0002 |
FETCH_MISSING |
Poiché il protocollo TDS non consente di inviare la colonna di stato finale senza inviare le colonne precedenti, i dati fittizi vengono inviati per le righe mancanti. I campi nullable sono impostati su Null e i campi a lunghezza fissa vengono impostati su 0
, vuoto o predefinito per tale colonna, in base alle esigenze.
Il conteggio delle DONE
righe è sempre 0
. Il DONE
messaggio contiene il conteggio delle righe effettivo del set di risultati e potrebbero essere visualizzati messaggi di errore o informativi tra tutti i messaggi TDS.
Per richiedere che i metadati relativi all'elenco di selezione del cursore vengano restituiti nel flusso TDS, impostare il flag di input RPC RETURN_METADATA
su 1
.
Esempi
R. Usare PREV per modificare una posizione del cursore
Si supponga che un cursore h2 produca un set di risultati con il contenuto seguente con la posizione corrente mostrata di seguito:
row 1 contents
row 2 contents
row 3 contents
row 4 contents <-- current position
row 5 contents
row 6 contents
Successivamente, un oggetto sp_cursorfetch
PREV
in cui le rows sono 5
posizionate logicamente il cursore due righe prima della prima riga del set di risultati. In questi casi, il cursore viene regolato in modo da partire dalla prima riga e restituire il numero di righe richieste. Ciò significa spesso che restituisce righe presenti nel PRIOR
buffer di recupero.
Nota
Si tratta esattamente del caso in cui il parametro di stato di RPC è impostato su 2.
B. Usare PREV_NOADJUST per restituire un numero inferiore di righe rispetto a PREV
PREV_NOADJUST
non include mai alcuna delle righe in corrispondenza o dopo la posizione corrente del cursore nel blocco di righe restituite. Nei casi in cui PREV
restituisce righe dopo la posizione corrente, PREV_NOADJUST
restituisce un numero inferiore di righe rispetto a quelle richieste in row. Data la posizione corrente nell'esempio A precedente, quando PREV
viene applicata, sp_cursorfetch (h2, 4, 1, 5)
recupera le righe seguenti:
row1 contents
row2 contents
row3 contents
row4 contents
row5 contents
Tuttavia, quando PREV_NOADJUST
viene applicato, sp_cursorfetch (h2, 512, 6, 5)
recupera solo le righe seguenti:
row1 contents
row2 contents
row3 contents