Condividi tramite


sp_cursor (Transact-SQL)

Si applica a: SQL Server

Richiede aggiornamenti posizionati. Con questa routine è possibile effettuare operazioni in una o più righe all'interno del buffer di recupero di un cursore. sp_cursor viene richiamato specificando ID = 1 in un pacchetto TDS (Tabular Data Stream).

Convenzioni relative alla sintassi Transact-SQL

Sintassi

sp_cursor cursor , optype , rownum , table
    [ , value [ ...n ] ]
[ ; ]

Argomenti

cursor

Handle del cursore. Il parametro del cursore è int e non può essere NULL. Questo parametro è il handle valore generato dal motore di database e restituito dalla sp_cursoropen routine.

optype

Parametro obbligatorio che definisce l'operazione eseguita dal cursore. Il parametro optype richiede uno dei valori seguenti.

valore Nome Descrizione
0X0001 UPDATE Consente di aggiornare una o più righe nel buffer di recupero. Le righe specificate nel numero di righe vengono riaccese e aggiornate.
0x0002 DELETE Consente di eliminare una o più righe nel buffer di recupero. Le righe specificate nel numero di righe vengono riaccese ed eliminate.
0X0004 INSERT Inserisce dati senza compilare un'istruzione INSERT .
0X0008 REFRESH Viene usato per riempire il buffer dalle tabelle sottostanti e può essere usato per aggiornare la riga se un aggiornamento o un'eliminazione non riesce a causa di un controllo della concorrenza ottimistica o dopo un oggetto UPDATE.
0X10 LOCK Determina l'acquisizione di un blocco di aggiornamento (U) nella pagina contenente la riga specificata. Questo blocco è compatibile con blocchi condivisi (S), ma non con blocchi esclusivi (X) o altri blocchi di aggiornamento. Può essere usato per implementare la funzione di blocco a breve termine.
0X20 SETPOSITION Viene usato solo quando il programma esegue un'istruzione o UPDATE successivaDELETE.
0X40 ABSOLUTE Può essere usato solo con UPDATE o DELETE. ABSOLUTE viene usato solo con KEYSET i cursori (ignorati per DYNAMIC i cursori) e STATIC i cursori non possono essere aggiornati.

Nota: se ABSOLUTE viene specificato in una riga del keyset che non è stato recuperato, l'operazione potrebbe non riuscire il controllo della concorrenza e il risultato restituito non può essere garantito.

rownum

Specifica quale delle righe nel buffer di recupero il cursore opera su, aggiorna o elimina. Questo parametro non influisce sul punto iniziale di un'operazione RELATIVEdi recupero , NEXTo , PREVIOUS né sugli aggiornamenti o sulle eliminazioni eseguite con sp_cursor.

rownum è un parametro obbligatorio che chiama per un valore di input int .

  • 1

    Indica la prima riga del buffer di recupero.

  • 2, 3, 4, ...n

    Indica la seconda, la terza e la quarta riga e così via.

  • 0

    Indica tutte le righe del buffer di recupero.

Questo parametro è valido solo per l'uso con UPDATEi valori , DELETE, REFRESHo LOCK optype .

table

Nome tabella che identifica la tabella a cui si applica optype quando la definizione del cursore comporta un join o nomi di colonna ambigui vengono restituiti dal parametro value . Se non viene designata alcuna tabella specifica, il valore predefinito è la prima tabella nella FROM clausola . Il parametro table è facoltativo e richiede un valore di input stringa. La stringa può essere specificata come qualsiasi tipo di dati Unicode o carattere oppure come nome di tabella in più parti.

value

Usato per inserire o aggiornare valori. Il parametro della stringa valore viene usato solo con UPDATE i valori optype e INSERT . La stringa può essere specificata come qualsiasi tipo di dati Unicode o character.

I nomi dei parametri per il valore possono essere assegnati dall'utente.

Valori del codice restituito

0 (esito positivo) o 1 (errore).

Osservazioni:

Parametro optype

Ad eccezione delle combinazioni di SETPOSITION con UPDATE, DELETE, REFRESHo LOCKo ABSOLUTE con UPDATE o DELETE, i valori optype si escludono a vicenda.

La SET clausola del UPDATE valore viene costruita dal parametro value .

Un vantaggio dell'uso del INSERT <optype> valore è che è possibile evitare di convertire dati non di tipo carattere in formato carattere per gli inserimenti. I valori vengono specificati nello stesso modo di UPDATE. Se le colonne obbligatorie non sono incluse, l'operazione INSERT ha esito negativo.

  • Il SETPOSITION valore non influisce sul punto iniziale di un'operazione RELATIVEdi recupero , NEXTo , PREVIOUS né esegue aggiornamenti o eliminazioni eseguite tramite l'interfaccia sp_cursor . Qualsiasi numero che non specifica una riga nel buffer di recupero comporta l'impostazione della posizione su 1, senza che venga restituito alcun errore. Una volta SETPOSITION eseguita, la posizione rimane attiva fino all'operazione successiva sp_cursorfetch , all'operazione T-SQL FETCH o sp_cursor SETPOSITION all'operazione tramite lo stesso cursore. Un'operazione successiva sp_cursorfetch imposta la posizione del cursore sulla prima riga del nuovo buffer di recupero, mentre altre chiamate di cursore non influiscono sul valore della posizione. SETPOSITIONpuò essere collegato da una OR clausola con REFRESH, DELETEUPDATE, o LOCK per impostare il valore della posizione sull'ultima riga modificata.

Se una riga nel buffer di recupero non viene specificata tramite il parametro rownum , la posizione viene impostata su 1, senza che venga restituito alcun errore. Una volta impostata la posizione, rimane attiva fino a quando non viene eseguita l'operazione successiva sp_cursorfetch , l'operazione T-SQL FETCH o sp_cursor SETPOSITION l'operazione sullo stesso cursore.

SETPOSITIONpuò essere collegato da una OR clausola con REFRESH, DELETEUPDATE, o LOCK per impostare la posizione del cursore sull'ultima riga modificata.

Parametro rownum

Se specificato, il parametro rownum può essere interpretato come numero di riga all'interno del keyset anziché come numero di riga all'interno del buffer di recupero. È responsabilità dell'utente garantire la gestione del controllo della concorrenza. Ciò significa che per SCROLL_LOCKS i cursori, è necessario mantenere in modo indipendente un blocco sulla riga specificata (che può essere eseguita tramite una transazione). Per OPTIMISTIC i cursori, è necessario aver recuperato in precedenza la riga per eseguire questa operazione.

Parametro table

Se il valore optype è UPDATE o INSERT e un'istruzione di aggiornamento o inserimento completa viene inviata come parametro value , il valore specificato per la tabella viene ignorato.

Nota

In relazione alle visualizzazioni, potrebbe essere modificata una sola tabella che partecipa alla visualizzazione. I nomi delle colonne dei parametri del valore devono riflettere i nomi di colonna nella vista, ma il nome della tabella può essere quello della tabella di base sottostante, nel qual caso sp_cursor sostituisce il nome della vista.

Parametro value

Esistono due alternative alle regole per l'uso del valore come indicato in precedenza nella sezione Argomenti:

  1. È possibile usare un nome @ anteporto al nome della colonna nell'elenco di selezione per tutti i parametri di valore denominati. Un vantaggio di questa alternativa è che la conversione dei dati potrebbe non essere necessaria.

  2. Usare un parametro per inviare un'istruzione completa UPDATE o oppure INSERT usare più parametri per inviare parti di un'istruzione UPDATE oINSERT, che il motore di database quindi compila in un'istruzione completa. Gli esempi sono disponibili nella sezione Esempi più avanti in questo articolo.

Esempi

Il parametro di valore alternativo usa

Per UPDATE

Quando si usa un singolo parametro, è possibile inviare un'istruzione UPDATE usando la sintassi seguente:

[ [ UPDATE <table_name> ] SET ] { <column name> = expression } [ , ...n ]

Se UPDATE <table_name> viene specificato, qualsiasi valore specificato per il parametro table viene ignorato.

Quando vengono usati più parametri, il primo parametro deve essere una stringa nel formato seguente:

[ SET ] <column name> = expression [ , ...n ]

I parametri successivi devono essere sotto forma di:

<column name> = expression [ , ...n ]

In questo caso, <table_name> nell'istruzione di aggiornamento costruito è quello specificato o predefinito in base al parametro table .

Per INSERT

Quando si usa un singolo parametro, è possibile inviare un'istruzione INSERT usando la sintassi seguente:

[ [ INSERT [ INTO ] <table_name> ] VALUES ] ( <expression> [ , ...n ] )

Se INSERT <table_name> viene specificato, qualsiasi valore specificato per il parametro table viene ignorato.

Quando vengono usati più parametri, il primo parametro deve essere una stringa nel formato seguente:

[ VALUES ] ( <expression> [ , ...n ] )

I parametri successivi devono essere sotto forma di expression [ , ...n ], tranne dove VALUES è stato specificato, nel qual caso deve essere presente un carattere finale ) dopo l'ultima espressione. In questo caso, l'oggetto nell'istruzione costruita UPDATE è quello specificato o predefinito in base al parametro table.<table_name>

Nota

È possibile inviare un parametro come parametro denominato, ad esempio @values. In questo caso non è possibile usare altri parametri denominati.