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:

  1. È 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.

  2. 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)