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 RELATIVE
di recupero , NEXT
o , 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 UPDATE
i valori , DELETE
, REFRESH
o 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
, REFRESH
o LOCK
o 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'operazioneRELATIVE
di recupero ,NEXT
o ,PREVIOUS
né esegue aggiornamenti o eliminazioni eseguite tramite l'interfacciasp_cursor
. Qualsiasi numero che non specifica una riga nel buffer di recupero comporta l'impostazione della posizione su1
, senza che venga restituito alcun errore. Una voltaSETPOSITION
eseguita, la posizione rimane attiva fino all'operazione successivasp_cursorfetch
, all'operazione T-SQLFETCH
osp_cursor
SETPOSITION
all'operazione tramite lo stesso cursore. Un'operazione successivasp_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.SETPOSITION
può essere collegato da unaOR
clausola conREFRESH
,DELETE
UPDATE
, oLOCK
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.
SETPOSITION
può essere collegato da una OR
clausola con REFRESH
, DELETE
UPDATE
, 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:
È 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.Usare un parametro per inviare un'istruzione completa
UPDATE
o oppureINSERT
usare più parametri per inviare parti di un'istruzioneUPDATE
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.