sp_cursor (Transact-SQL)

Si applica a: sìSQL Server (tutte le versioni supportate)

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 del flusso TDS (Tabular Data Stream).

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

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

cursor
Handle del cursore. Cursor è un parametro obbligatorio che richiede 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 in rownum vengono nuovamente accessibili e aggiornate.
0x0002 DELETE Consente di eliminare una o più righe nel buffer di recupero. Le righe specificate in rownum vengono nuovamente accessibili 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 SQL Server U-Lock 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 utilizzato solo quando il programma emette una SQL Server successiva istruzione DELETE o UPDATE posizionata.
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 del keyset che non è stata recuperata, l'operazione potrebbe non riuscire a eseguire 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 richiede 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 di aggiornamento, eliminazione, aggiornamento o blocco.

tabella
Nome della tabella che identifica la tabella a cui viene applicato optype quando la definizione del cursore include un join o nomi di colonna ambigui restituiti dal parametro del valore . 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 stringa. È 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 della stringa di valore viene usato solo con i valori optype di aggiornamento e inserimento. È possibile specificare la stringa come qualsiasi tipo di dati UNICODE o carattere.

Nota

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

Valori del codice restituito

Quando si utilizza una RPC, un'operazione di eliminazione o aggiornamento posizionata con un numero di buffer 0 restituirà un messaggio completato con un conteggio delle righe pari a 0 (esito negativo) o 1 (esito positivo) per ogni riga del buffer di recupero.

Commenti

Parametro optype

Fatta eccezione per le combinazioni di seposition con UPDATE, DELETE, REFRESH o LOCK; o ABSOLUTe con UPDATE o DELETE, i valori optype si escludono a vicenda.

La clausola SET del valore di aggiornamento viene costruita dal parametro value .

Un vantaggio dell'uso del valore INSERT optype è 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. Una volta eseguita la funzione seposition, la posizione rimane attiva fino alla successiva operazione di sp_cursorfetch, operazione di recupero T-SQL o sp_cursor operazione di posizione 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 restituire 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 il numero di riga all'interno del keyset anziché il 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 viene inviata un'istruzione Update o INSERT completa come parametro value , il valore specificato per Table viene ignorato.

Nota

È possibile modificare una sola tabella che partecipa a una vista. I nomi delle colonne dei parametri di valore devono riflettere i nomi delle colonne nella vista, ma il nome della tabella può essere quello della tabella di base sottostante. in questo caso sp_cursor sostituirà il nome della vista.

Parametro value

Esistono due alternative alle regole per l'utilizzo di value come indicato in precedenza nella sezione arguments:

  1. È possibile usare un nome ' @ ' anteposto al nome della colonna nell'elenco di selezione per tutti i parametri del valore denominato. Un vantaggio di questa alternativa consiste nella possibilità che la conversione di dati non sia necessaria.

  2. Utilizzare un parametro per inviare un'istruzione UPDATE o INSERT completa oppure utilizzare più parametri per inviare parti di un'istruzione UPDATE o INSERT che SQL Server verrà compilata in un'istruzione completa. È possibile trovare alcuni esempi nella sezione Esempi più avanti in questo argomento.

Esempio

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 <table name> si specifica 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, l'oggetto <table name> nell'istruzione di aggiornamento costruita è quello specificato o impostato come valore predefinito dal 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 <table name> viene specificato 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, l'oggetto <table name> nell'istruzione di aggiornamento costruita è quello specificato o impostato come valore predefinito dal parametro Table .

Nota

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

Vedere anche

sp_cursoropen ()Transact-SQL
sp_cursorfetch ()Transact-SQL
Stored procedure di sistema (Transact-SQL)