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).
Si applica a: SQL Server ( SQL Server 2008 (10.0.x) fino alla versione corrente. |
Convenzioni di sintassi Transact-SQL
Sintassi
sp_cursor cursor, optype, rownum, table
[ , value[...n]]]
Argomenti
cursor
Handle del cursore. cursor è un parametro obbligatorio che chiama per un valore di input int . cursor è il valore dell'handle generato da SQL Server e restituito dalla routine sp_cursoropen.
optype
Parametro obbligatorio che definisce l'operazione che verrà effettuata dal cursore. optype richiede uno dei valori di input int seguenti.
Valore | Nome | Descrizione |
---|---|---|
0X0001 | UPDATE | Consente di aggiornare una o più righe nel buffer di recupero. Le righe specificate nel numero di righe sono accessibili nuovamente e aggiornate. |
0x0002 | DELETE | Consente di eliminare una o più righe nel buffer di recupero. Le righe specificate nel numero di righe vengono accessibili nuovamente ed eliminate. |
0X0004 | INSERT | Inserisce dati senza compilare un'istruzione SQL INSERT . |
0X0008 | REFRESH | Consente di inserire nuovamente dati nel buffer dalle tabelle sottostanti e può essere usato per aggiornare la riga nel caso in cui un aggiornamento o un'eliminazione non riesca a causa del controllo della concorrenza ottimistica oppure dopo un'operazione UPDATE. |
0X10 | LOCK | Determina l'acquisizione di un blocco U-Lock di SQL Server nella pagina contenente la riga specificata. Tale blocco è compatibile con i blocchi S ma non con i blocchi X o con altri blocchi U. Può essere usato per implementare la funzione di blocco a breve termine. |
0X20 | SETPOSITION | Viene usato solo quando il programma esegue un'istruzione DELETE o UPDATE successiva di SQL Server. |
0X40 | ABSOLUTE | Può essere usato solo insieme ad UPDATE o DELETE. ABSOLUTE viene usato solo con i cursori KEYSET, viene ignorato per i cursori DYNAMIC e i cursori STATIC non possono essere aggiornati. Nota: se si specifica ABSOLUTE in una riga nel keyset che non è stato recuperato, l'operazione potrebbe non riuscire il controllo della concorrenza e il risultato restituito non può essere garantito. |
Rownum
Specifica le righe del buffer di recupero che verranno usate, aggiornate o eliminate mediante il cursore.
Nota
Non influisce sul punto di partenza di qualsiasi operazione di recupero RELATIVE, NEXT o PREVIOUS, né su eliminazioni o aggiornamenti eseguiti utilizzando sp_cursor.
rownum è un parametro obbligatorio che chiama per un valore di input int .
1
Indica la prima riga del buffer di recupero.
2
Indica la seconda riga del buffer di recupero.
3, 4, 5
Indica la terza riga e così via.
n
Indica l'ennesima riga del buffer di recupero.
0
Indica tutte le righe del buffer di recupero.
Nota
È valido solo per l'utilizzo con i valori optype UPDATE, DELETE, REFRESH o LOCK.
table
Nome tabella che identifica la tabella a cui si applica optype quando la definizione del cursore implica un join o nomi di colonna ambigui vengono restituiti dal parametro value . Se non è definita una tabella specifica, l'impostazione predefinita è la prima tabella nella clausola FROM. table è un parametro facoltativo che richiede un valore di input String. È possibile specificare la stringa come qualsiasi tipo di dati UNICODE o carattere. table può essere un nome di tabella in più parti.
value
Usato per inserire o aggiornare valori. Il parametro stringa valore viene usato solo con i valori optype UPDATE e INSERT. È possibile specificare la stringa come qualsiasi tipo di dati UNICODE o carattere.
Nota
I nomi dei parametri per il valore possono essere assegnati dall'utente.
Valori del codice restituito
Quando si usa una RPC, un'operazione DELETE o UPDATE posizionata con un numero di buffer 0 restituirà un messaggio DONE con un conteggio delle righe pari a 0 (errore) o 1 (esito positivo) per ogni riga nel buffer di recupero.
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 clausola SET del valore UPDATE viene costruita dal parametro value .
Un vantaggio dell'uso del valore optype INSERT è che è possibile evitare di convertire dati non di tipo carattere in formato carattere per gli inserimenti. I valori vengono specificati con le stesse modalità di UPDATE. Se non sono incluse colonne obbligatorie, l'operazione INSERT non riesce.
- Il valore SETPOSITION non influisce sul punto di partenza di qualsiasi operazione di recupero RELATIVE, NEXT o PREVIOUS, né su eliminazioni o aggiornamenti eseguiti utilizzando l'interfaccia di sp_cursor. Qualsiasi numero che non specifichi una riga nel buffer di recupero comporterà l'impostazione della posizione su 1 senza restituzione di errori. Dopo l'esecuzione di SETPOSITION, la posizione rimane attiva fino alla successiva operazione di sp_cursorfetch, all'operazione T-SQL FETCH o sp_cursor'operazione SETPOSITION tramite lo stesso cursore. Un'operazione sp_cursorfetch successiva imposterà la posizione del cursore sulla prima riga nel nuovo buffer di recupero, mentre le altre chiamate del cursore non influiranno sul valore della posizione. SETPOSITION può essere collegato da una clausola OR con REFRESH, UPDATE, DELETE o LOCK allo scopo di 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 verrà impostata su 1, senza che venga restituito alcun errore. Dopo l'impostazione, la posizione rimane effettiva fino a quando non verrà eseguita sullo stesso cursore la successiva operazione sp_cursorfetch, T-SQL o SETPOSITION di sp_cursor.
SETPOSITION può essere collegato da una clausola OR con REFRESH, UPDATE, DELETE o LOCK allo scopo di 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 i cursori SCROLL_LOCKS è necessario gestire indipendentemente un blocco nella riga specificata. Questa operazione può essere eseguita tramite una transazione. Per eseguire questa operazione con i cursori OPTIMISTIC, è necessario avere recuperato la riga precedentemente.
Parametro table
Se il valore optype è UPDATE o INSERT e un'istruzione update o insert completa viene inviata come parametro value , il valore specificato per la tabella viene ignorato.
Nota
È possibile modificare una sola tabella che partecipa a una vista. I nomi delle colonne dei parametri 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 sostituirà 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 preceduto da '@' per il nome della colonna nell'elenco di selezione per i parametri di valore denominati. Un vantaggio di questa alternativa consiste nella possibilità che la conversione di dati non sia necessaria.
Usare un parametro per inviare un'istruzione UPDATE o INSERT completa o usare più parametri per inviare parti di un'istruzione UPDATE o INSERT che SQL Server compilerà quindi in un'istruzione completa. È possibile trovare alcuni esempi nella sezione Esempi più avanti in questo argomento.
Esempi
Utilizzi alternativi del parametro value
Per UPDATE:
Quando viene usato un solo parametro, si potrebbe inviare un'istruzione UPDATE usando la sintassi seguente:
[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,...n]
Nota
Se viene specificato il nome> della tabella UPDATE<, qualsiasi valore specificato per il parametro table verrà ignorato.
Quando vengono usati più parametri, il primo parametro deve essere una stringa nel formato seguente:
[ SET ] <column name> = expression [,...n]
e i parametri successivi devono essere nel formato:
<column name> = expression [,...n]
In questo caso, il <nome> della tabella nell'istruzione update costruita è quello specificato o predefinito in base al parametro table .
Per INSERT:
Quando viene usato un solo parametro, si potrebbe inviare un'istruzione INSERT usando la sintassi seguente:
[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,...n] )
Nota
Se si specifica il nome> della tabella INSERT<, qualsiasi valore specificato per il parametro table verrà ignorato.
Quando vengono usati più parametri, il primo parametro deve essere una stringa nel formato seguente:
[ VALUES ( ] <expression> [,...n]
e i parametri successivi devono essere nel formato:
expression [,...n]
ad eccezione dei casi in cui è stato specificato VALUES. In questo caso, l'ultima espressione deve essere seguita da una parentesi finale ")". In questo caso, il <nome> della tabella nell'istruzione UPDATE costruita è quello specificato o predefinito in base al parametro table .
Nota
È possibile inviare un parametro come parametro denominato, ad esempio "@VALUES
". In questo caso è possibile non usare altri parametri denominati.
Vedi anche
sp_cursoropen (Transact-SQL)
sp_cursorfetch (Transact-SQL)
Stored procedure di sistema (Transact-SQL)
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per