Condividi tramite


sp_cursorfetch (Transact-SQL)

Recupera un buffer di una o più righe dal database. Il gruppo di righe di questo buffer viene denominato fetch buffer del cursore. sp_cursorfetch viene richiamata specificando ID = 7 in un pacchetto del flusso TDS.

Si applica a: SQL Server (da SQL Server 2008 a versione corrente).

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • cursor
    Valore dell'handle generato da SQL Server e restituito da sp_cursoropen. cursor è un parametro obbligatorio che richiede un valore di input int. Per ulteriori informazioni, vedere la sezione Osservazioni di seguito in questo argomento.

  • fetchtype
    Specifica il buffer del cursore da recuperare. fetchtype è un parametro facoltativo che richiede uno dei valori di input interi seguenti.

    Valore

    Nome

    Descrizione

    0x0001

    FIRST

    Recupera il primo buffer di nrows righe. 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 nrows righe.

    0x0004

    PREV

    Recupera il buffer precedente di nrows righe.

    Nota

       Se si utilizza PREV per un cursore FORWARD_ONLY, viene restituito un messaggio di errore, in quanto FORWARD_ONLY supporta lo scorrimento in una sola direzione.

    0x0008

    LAST

    Recupera l'ultimo buffer di nrows righe. Se nrows è uguale a 0, il cursore viene posizionato dopo il set di risultati e non vengono restituite righe.

    > [!NOTE]
    > <P>&nbsp;&nbsp;&nbsp;Se si utilizza LAST per un cursore FORWARD_ONLY, viene restituito un messaggio di errore, in quanto FORWARD_ONLY supporta lo scorrimento in una sola direzione.</P>
    

    0x10

    ABSOLUTE

    Recupera un buffer di nrows righe a partire dalla riga rownum.

    > [!NOTE]
    > <P>&nbsp;&nbsp;&nbsp;Se si utilizza ABSOLUTE per un cursore DYNAMIC o un cursore FORWARD_ONLY, viene restituito un messaggio di errore, in quanto FORWARD_ONLY supporta lo scorrimento in una sola direzione.</P>
    

    0x20

    RELATIVE

    Recupera il buffer di nrows righe a partire dalla riga specificata come valore rownum di righe a partire dalla prima riga del blocco corrente. In questo caso rownum può essere un numero negativo.

    > [!NOTE]
    > <P>&nbsp;&nbsp;&nbsp;Se si utilizza RELATIVE per un cursore FORWARD_ONLY, viene restituito un messaggio di errore, in quanto FORWARD_ONLY supporta lo scorrimento in una sola direzione.</P>
    

    0x80

    REFRESH

    Reinserisce nel buffer dati delle tabelle sottostanti.

    0x100

    INFO

    Recupera informazioni sul cursore. Tali informazioni vengono restituite tramite i parametri rownum e nrows. Pertanto, quando viene specificato INFO, rownum e nrows diventano parametri di output.

    0x200

    PREV_NOADJUST

    Viene utilizzato 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 utilizzato con uno degli altri valori di fetchtype, ad eccezione di INFO.

    > [!NOTE]
    > <P>&nbsp;&nbsp;&nbsp;Il valore 0x40 non è supportato.</P>
    
    
    Per ulteriori informazioni, vedere la sezione Osservazioni di seguito in questo argomento.
    
    • rownum
      Parametro facoltativo utilizzato per specificare la posizione di riga dei valori ABSOLUTE e INFO di fetchtype esclusivamente mediante valori interi per input, output o entrambi. rownum funge da offset di riga per il valore di bit fetchtype RELATIVE. rownum viene ignorato per tutti gli altri valori. Per ulteriori informazioni, vedere la sezione Osservazioni di seguito in questo argomento.

    • nrows
      Parametro facoltativo utilizzato per specificare il numero di righe da recuperare. Se per nrows non viene specificato alcun valore, il valore predefinito è 20 righe. Per impostare la posizione senza restituire dati, specificare il valore 0. Quando nrows viene applicato alla query INFO fetchtype, restituisce il numero di righe complessivo della query.

      Nota

         nrows viene ignorato dal valore di bit REFRESH di fetchtype.

      Per ulteriori informazioni, vedere la sezione Osservazioni di seguito in questo argomento.

    Valori di codice restituiti

    Nelle tabelle seguenti vengono indicati i valori che possono essere restituiti quando si specifica il valore di bit INFO.

    Nota

    : Se non vengono restituite righe, il contenuto del buffer rimane inalterato.

    <rownum>

    Impostare su

    Se non aperto

    0

    Se posizionato prima del set di risultati

    0

    Se posizionato dopo il set di risultati

    -1

    Per i cursori STATIC e KEYSET

    Numero di riga assoluto della posizione corrente nel set di risultati

    Peri cursori DYNAMIC

    1

    Per ABSOLUTE

    -1 restituisce l'ultima riga di un set.

    -2 restituisce la penultima riga di un set e così via.

    Nota

    Se in questo caso è richiesto il recupero di più di una riga, vengono restituite le ultime due righe del set di risultati.

    <nrows>

    Impostare su

    Se non aperto

    0

    Per i cursori STATIC e KEYSET

    In genere la dimensione del keyset corrente.

    –m se la creazione del cursore è asincrona e sono state rilevate m righe fino a questo punto.

    Peri cursori DYNAMIC

    -1

    Osservazioni

    Parametro cursor

    Prima dell'esecuzione di qualsiasi operazione di recupero, il cursore precede per impostazione predefinita la prima riga del set di risultati.

    Parametro fetchtype

    Ad eccezione di SKIP_UPD_CNCY, i valori di fetchtype si escludono a vicenda.

    Quando viene specificato SKIP_UPDT_CNCY, i valori della colonna timestamp non vengono scritti nella tabella di keyset quando viene recuperata o aggiornata una riga. 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 i cursori KEYSET, ciò significa che per la tabella di keyset i valori vengono impostati durante l'ultima operazione FETCH non ignorata, se ne è stata eseguita una. In caso contrario, i valori vengono impostati durante il popolamento.

    Per i cursori DYNAMIC, ciò significa che se l'operazione FETCH viene eseguita con l'aggiornamento, vengono prodotti gli stessi risultati di KEYSET. Per qualsiasi altro tipo di recupero, la tabella di keyset viene troncata. Ciò significa che è in corso l'inserimento delle righe e i valori delle colonne timestamp non vengono definiti. Pertanto, quando si esegue sp_cursorfetch per i cursori DYNAMIC, evitare di utilizzare 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 utilizza rownum, i dati vengono inseriti nel buffer a partire dalla riga specificata.

    Il valore ABSOLUTE di fetchtype si riferisce alla posizione di rownum all'interno dell'intero set di risultati. Un numero negativo per ABSOLUTE specifica che l'operazione inizia a contare le righe a partire dalla fine del set di risultati.

    Il valore RELATIVE di fetchtype si riferisce alla posizione di rownum rispetto alla posizione del cursore all'inizio del buffer corrente. Un numero negativo per RELATIVE specifica che il cursore va all'indietro a partire dalla posizione corrente.

    Parametro nrows

    I valori REFRESH e INFO di fetchtype ignorano questo parametro.

    Quando si specifica il valore FIRST di fetchtype, con un valore 0 per nrow, il cursore viene posizionato prima del set di risultati nel cui buffer di recupero non sono presenti righe.

    Quando si specifica il valore LAST per fetchtype, con un valore 0 per nrow, il cursore viene posizionato dopo il set di risultati nel cui buffer di recupero corrente non sono presenti righe.

    Per i valori NEXT, PREV, ABSOLUTE, RELATIVE e PREV_NOADJUST di fetchtype , il valore 0 per nrow non è valido.

    Considerazioni su RPC

    Lo stato restituito di RPC indica se il parametro di dimensione del keyset è finale oppure no, cioè se è in corso il popolamento asincrono nel keyset o nella tabella temporanea.

    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 tipico di risultati, ovvero il formato della colonna (0x2a), le righe (0xd1), infine done (0xfd). I token dei metadati vengono inviati nello stesso formato specificato per sp_cursoropen, cioè 0x81, 0xa5 e 0xa4 per gli utenti di SQL Server 7.0 e così via. Gli indicatori di stato delle righe vengono inviati come colonne nascoste, analogamente alla modalità BROWSE, alla fine di ogni riga con nome di colonna rowstat e tipo di dati INT4. Nella colonna rowstat è disponibile uno dei valori mostrati nella tabella seguente:

    Valore

    Descrizione

    0x0001

    FETCH_SUCCEEDED

    0x0002

    FETCH_MISSING

    Poiché il protocollo TDS non consente di inviare la colonna dello stato finale senza inviare le colonne precedenti, per le righe mancanti vengono inviati dati fittizi, cioè campi che ammettono i valori Null, campi a lunghezza fissa impostati su 0, vuoti oppure il valore predefinito per quella colonna, a seconda della situazione specifica.

    Il conteggio delle righe per DONE sarà sempre zero. Il messaggio DONE include il conteggio delle righe del set di risultati effettivo. Tra i messaggi TDS potrebbero essere visualizzati messaggi di errore o informativi.

    Per richiedere che vengano restituiti metadati sull'elenco di selezione del cursore nel flusso TDS, impostare il flag di input RPC RETURN_METADATA su 1.

    Esempi

    A.Utilizzo di 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
    

    Si immagini che successivamente un'operazione PREV sp_cursorfetch con il valore di nrows impostato su 5 posizioni 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. Questo spesso significa che restituirà righe che si trovavano nel buffer di recupero di PRIOR.

    Nota

     Si tratta esattamente del caso in cui il parametro di stato di RPC è impostato su 2.

    B.Utilizzo di PREV_NOADJUST per restituire un numero inferiore di righe rispetto a PREV

    PREV_NOADJUST non include mai nel blocco di righe che restituisce le righe che si trovano in corrispondenza della posizione corrente del cursore o dopo tale posizione. Nei casi in cui PREV restituisce righe dopo la posizione corrente, PREV_NOADJUST restituisce un numero inferiore di righe rispetto a quanto richiesto in nrows. Presupponendo che la posizione corrente del cursore sia quella dell'esempio A precedente, quando viene applicato PREV, sp_cursorfetch(h2, 4, 1, 5) recupera le righe seguenti:

    row1 contents 
    row2 contents
    row3 contents
    row4 contents
    row5 contents
    

    Quando invece viene applicato PREV_NOADJUST, sp_cursorfetch(h2, 512, 6, 5) recupera solo le righe seguenti:

    row1 contents 
    row2 contents
    row3 contents 
    

    Vedere anche

    Riferimento

    sp_cursoropen (Transact-SQL)

    Stored procedure di sistema (Transact-SQL)