SET @local_variable (Transact-SQL)
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL di Azure Synapse Analytics Platform System (PDW) in Microsoft Fabric Warehouse nel database SQL di Microsoft Fabric in Microsoft Fabric
Imposta la variabile locale specificata, creata in precedenza usando l'istruzione DECLARE @local_variable
, sul valore specificato.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
Sintassi per SQL Server, database SQL di Azure e Istanza gestita di SQL di Azure:
SET
{ @local_variable
[ . { property_name | field_name } ] = { expression | udt_name { . | :: } method_name }
}
| { @SQLCLR_local_variable.mutator_method }
| { @local_variable
{ += | -= | *= | /= | %= | &= | ^= | |= } expression
}
| { @cursor_variable =
{ @cursor_variable | cursor_name
| { CURSOR [ [ LOCAL | GLOBAL ] ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ , ...n ] ] } ]
}
}
}
Sintassi per Azure Synapse Analytics e Parallel Data Warehouse e Microsoft Fabric:
SET @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression
Argomenti
@local_variable
Nome di una variabile di qualsiasi tipo tranne cursor, text, ntext, image o table. I nomi delle variabili devono iniziare con un simbolo di chiocciola (@
) e rispettare le regole relative agli identificatori.
property_name
Proprietà di un tipo definito dall'utente.
field_name
Campo pubblico di un tipo definito dall'utente.
udt_name
Nome di un tipo CLR (Common Language Runtime) definito dall'utente.
{ . | :: }
Specifica un metodo di un tipo CRL definito dall'utente. Per un metodo di istanza (non statico), usare un punto (.
). Per un metodo statico, usare due punti (::
). Per richiamare un metodo, una proprietà o un campo di un tipo CLR definito dall'utente, è necessario disporre dell'autorizzazione EXECUTE per il tipo.
method_name ( argomento [ ,... n ] )
Metodo di un tipo definito dall'utente che accetta uno o più argomenti per modificare lo stato di un'istanza di un tipo. I metodi statici devono essere pubblici.
@SQLCLR_local_variable
Variabile il cui tipo si trova in un assembly. Per altre informazioni, vedere Concetti relativi alla programmazione dell'integrazione di Common Language Runtime (CLR).
mutator_method
Metodo dell'assembly che può modificare lo stato dell'oggetto. A questo metodo viene applicato SQLMethodAttribute.IsMutator.
{ += | -= | *= | /= | %= | &= | ^= | |= }
Operatore di assegnazione composto:
+=
- Aggiungere e assegnare-=
- Sottrarre e assegnare*=
- Moltiplicare e assegnare/=
- Dividere e assegnare%=
- Modulo e assegnazione&=
- Bit per bitAND
e assegna^=
- Bit per bitXOR
e assegna|=
- Bit per bitOR
e assegna
expression
Qualsiasi espressione valida.
cursor_variable
Nome di una variabile di cursore. Se in precedenza la variabile di cursore di destinazione faceva riferimento a un cursore diverso, il riferimento precedente viene rimosso.
cursor_name
Nome di un cursore dichiarato tramite l'istruzione DECLARE CURSOR
.
CURSOR
Specifica che l'istruzione SET
contiene una dichiarazione di un cursore.
SCROLL
Specifica che il cursore supporta tutte le opzioni di recupero: FIRST
, LAST
, PRIOR
NEXT
, RELATIVE
, e ABSOLUTE
. Non è possibile specificare SCROLL
quando si specifica FAST_FORWARD
anche .
FORWARD_ONLY
Specifica che il cursore supporta solo l'opzione FETCH NEXT
. Il cursore viene recuperato in una sola direzione, dalla prima riga all'ultima. Quando si specificano FORWARD_ONLY
senza le STATIC
parole chiave , KEYSET
o DYNAMIC
, il cursore viene implementato come DYNAMIC
. Se non si specifica o FORWARD_ONLY
SCROLL
, FORWARD_ONLY
è l'impostazione predefinita, a meno che non si specifichino le parole chiave STATIC
, KEYSET
o DYNAMIC
. Per STATIC
i cursori , KEYSET
e DYNAMIC
è SCROLL
il valore predefinito.
STATIC
Definisce un cursore che crea una copia temporanea dei dati utilizzati dal cursore. Tutte le richieste al cursore vengono risposte da questa tabella temporanea in tempdb
. Di conseguenza, le modifiche apportate alle tabelle di base dopo l'apertura del cursore non si riflettono nei dati restituiti dalle operazioni di recupero eseguite sul cursore. Questo cursore non supporta le modifiche.
KEYSET
Specifica che all'apertura del cursore l'appartenenza e l'ordine delle righe nel cursore sono fissi. Il set di chiavi che identificano in modo univoco le righe viene integrato nella tabella keysettable in tempdb
. Le modifiche di valori non chiave delle tabelle di base che sono state apportate dal proprietario del cursore o di cui è stato eseguito il commit da altri utenti sono visibili quando il proprietario scorre il cursore. Gli inserimenti eseguiti da altri utenti non sono visibili e non è possibile eseguire inserimenti tramite un cursore server Transact-SQL.
Se viene eliminata una riga, un tentativo di recupero della riga restituisce un @@FETCH_STATUS
valore di -2
. Le operazioni di aggiornamento di valori di chiave dall'esterno del cursore sono simili a un'operazione di eliminazione della riga precedente seguita da un'operazione di inserimento della nuova riga. La riga con i nuovi valori non è visibile e tenta di recuperare la riga con i valori precedenti restituisce un @@FETCH_STATUS
valore di -2
. I nuovi valori sono visibili se l'aggiornamento viene eseguito tramite il cursore specificando la WHERE CURRENT OF
clausola .
DYNAMIC
Definisce un cursore che visualizza nel set di risultati tutte le modifiche apportate ai dati delle righe quando il proprietario scorre il cursore. I valori dei dati, l'ordine e l'appartenenza delle righe possono cambiare a ogni operazione di recupero. I cursori dinamici non supportano le opzioni di recupero assoluto e relativo.
FAST_FORWARD
Specifica un FORWARD_ONLY
cursore , READ_ONLY
con ottimizzazioni abilitate. FAST_FORWARD
non può essere specificato quando SCROLL
viene specificato anche .
READ_ONLY
Impedisce l'esecuzione di aggiornamenti tramite il cursore. Non è possibile fare riferimento al cursore in una WHERE CURRENT OF
clausola in un'istruzione UPDATE
o DELETE
. Questa opzione è prioritaria rispetto alla funzionalità di aggiornamento predefinita di un cursore.
SCROLL LOCKS
Specifica che gli aggiornamenti o le eliminazioni posizionate eseguite tramite il cursore avranno esito positivo. SQL Server blocca le righe mentre vengono lette nel cursore per garantirne la disponibilità per modifiche successive. Non è possibile specificare SCROLL_LOCKS
quando FAST_FORWARD
viene specificato anche .
OPTIMISTIC
Specifica che le eliminazioni o gli aggiornamenti posizionati eseguiti tramite il cursore non avranno esito positivo se la riga è stata aggiornata dopo la lettura nel cursore. SQL Server non blocca le righe mentre vengono lette nel cursore. Determina invece se la riga è stata modificata dopo la lettura nel cursore usando confronti tra i valori della colonna timestamp oppure un valore di checksum se la tabella non contiene una colonna timestamp. Se la riga è stata modificata, i tentativi di eseguire un aggiornamento o un'eliminazione posizionata hanno esito negativo. Non è possibile specificare OPTIMISTIC
quando FAST_FORWARD
viene specificato anche .
TYPE_WARNING
Specifica che deve essere inviato un messaggio di avviso al client quando il cursore viene convertito in modo implicito dal tipo richiesto in un altro tipo.
FOR select_statement
Istruzione standard SELECT
che definisce il set di risultati del cursore. Le parole chiave e INTO
non sono consentite FOR BROWSE
all'interno del select_statement di una dichiarazione di cursore.
Se si usa DISTINCT
, UNION
GROUP BY
, o HAVING
o si include un'espressione di aggregazione nella select_list, il cursore viene creato come STATIC
.
Se ogni tabella sottostante non ha un indice univoco e un cursore ISO SCROLL
o se viene richiesto un cursore Transact-SQL KEYSET
, il cursore viene automaticamente un STATIC
cursore.
Se select_statement contiene una ORDER BY
clausola in cui le colonne non sono identificatori di riga univoci, un DYNAMIC
cursore viene convertito in un KEYSET
cursore o in un STATIC
cursore se non è possibile aprire un KEYSET
cursore. Questo processo si verifica anche per un cursore definito usando la sintassi ISO, ma senza la STATIC
parola chiave .
READ ONLY
Impedisce l'esecuzione di aggiornamenti tramite il cursore. Non è possibile fare riferimento al cursore in una WHERE CURRENT OF
clausola in un'istruzione UPDATE
o DELETE
. Questa opzione è prioritaria rispetto alla funzionalità di aggiornamento predefinita di un cursore. Questa parola chiave varia rispetto a quella precedente READ_ONLY
, avendo uno spazio anziché un carattere di sottolineatura tra READ
e ONLY
.
UPDATE [ OF column_name [ ,... n ] ]
Definisce le colonne aggiornabili nel cursore. Se si specifica OF <column_name> [ , ...n ]
, è possibile apportare modifiche solo nelle colonne elencate. Quando non viene fornito alcun elenco, tutte le colonne possono essere aggiornate, a meno che il cursore non sia definito come READ_ONLY
.
Osservazioni:
Dopo aver dichiarato una variabile, viene inizializzata in NULL
. Usare l'istruzione SET
per assegnare un valore che non NULL
è a una variabile dichiarata. L'istruzione SET
che assegna un valore alla variabile restituisce un singolo valore. Quando si inizializzano più variabili, usare un'istruzione separata SET
per ogni variabile locale.
È possibile usare variabili solo nelle espressioni, non in sostituzione di parole chiave o nomi di oggetto. Per costruire istruzioni Transact-SQL dinamiche, usare EXECUTE
.
Anche se le regole di sintassi per SET @cursor_variable
includono le LOCAL
parole chiave e GLOBAL
, quando si usa la SET @cursor_variable = CURSOR...
sintassi , il cursore viene creato come GLOBAL
o LOCAL
, a seconda dell'impostazione dell'opzione predefinita per il database del cursore locale.
Le variabili di cursore sono sempre locali, anche quando fanno riferimento a un cursore globale. Quando una variabile di cursore fa riferimento a un cursore globale, esistono sia un riferimento al cursore locale che un riferimento al cursore globale. Per altre informazioni, vedere Esempio D, Usare SET con un cursore globale.
Per altre informazioni, vedere DECLARE CURSOR (Transact-SQL).
È possibile usare l'operatore di assegnazione composta ovunque sia presente un'assegnazione con un'espressione sul lato destro dell'operatore, incluse le variabili e un SET
in un'istruzione UPDATE
, SELECT
e RECEIVE
.
Non usare una variabile in un'istruzione SELECT
per concatenare i valori, ovvero per calcolare i valori aggregati. È possibile che si verifichino risultati imprevisti della query perché tutte le espressioni nell'elenco SELECT
(incluse le assegnazioni) non vengono necessariamente eseguite una sola volta per ogni riga di output. Per altre informazioni, vedere kb 287515.
Autorizzazioni
È richiesta l'appartenenza al ruolo public. Tutti gli utenti possono usare SET @local_variable
.
Esempi
Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022
o AdventureWorksDW2022
, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.
R. Stampare il valore di una variabile inizializzata tramite SET
Nell'esempio seguente viene creata la variabile @myVar
, viene immesso un valore stringa nella variabile e quindi viene visualizzato il valore della variabile @myVar
.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT @myVar;
GO
B. Usare una variabile locale assegnata a un valore usando SET in un'istruzione SELECT
Nell'esempio seguente viene creata una variabile locale denominata @state
e viene usata la variabile locale in un'istruzione SELECT
per trovare il nome (FirstName
) e il nome della famiglia (LastName
) di tutti i dipendenti che risiedono nello stato di Oregon
.
USE AdventureWorks2022;
GO
DECLARE @state CHAR(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
GO
C. Usare un'assegnazione composta per una variabile locale
I due esempi seguenti consentono di ottenere lo stesso risultato. Ogni esempio crea una variabile locale denominata @NewBalance
, la moltiplica per 10
, quindi visualizza il nuovo valore della variabile locale in un'istruzione SELECT
. Nel secondo esempio viene utilizzato un operatore di assegnazione composto.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT @NewBalance;
GO
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;
GO
D. Usare SET con un cursore globale
Nell'esempio seguente viene creata una variabile locale e quindi viene impostata la variabile di cursore sul nome del cursore globale.
DECLARE my_cursor CURSOR GLOBAL
FOR SELECT * FROM Purchasing.ShipMethod
DECLARE @my_variable CURSOR ;
SET @my_variable = my_cursor ;
--There is a GLOBAL cursor declared(my_cursor) and a LOCAL variable
--(@my_variable) set to the my_cursor cursor.
DEALLOCATE my_cursor;
GO
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.
E. Definire un cursore usando SET
Nell'esempio seguente viene utilizzata l'istruzione SET
per definire un cursore.
DECLARE @CursorVar CURSOR;
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks2022.HumanResources.vEmployee
WHERE LastName like 'B%';
OPEN @CursorVar;
FETCH NEXT FROM @CursorVar;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @CursorVar
END;
CLOSE @CursorVar;
DEALLOCATE @CursorVar;
GO
F. Assegnare un valore da una query
Nell'esempio seguente viene utilizzata una query per assegnare un valore a una variabile.
USE AdventureWorks2022;
GO
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
GO
G. Assegnare un valore a una variabile di tipo definita dall'utente modificando una proprietà del tipo
Nell'esempio seguente viene impostato un valore per il tipo definito dall'utente (UDT) Point
tramite la modifica del valore della proprietà X
del tipo.
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
Per altre informazioni sulla creazione del tipo definito dall'utente Point
a cui si fa riferimento in questo esempio, vedere gli esempi seguenti nell'articolo Creazione di tipi definiti dall'utente (UDT).
H. Assegnare un valore a una variabile di tipo definita dall'utente richiamando un metodo del tipo
Nell'esempio seguente viene impostato un valore per il tipo definito dall'utente point tramite la chiamata del metodo SetXY
del tipo.
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
I. Creare una variabile per un tipo CLR e chiamare un metodo mutatore
Nell'esempio seguente viene creata una variabile per il tipo Point
, quindi viene eseguito un metodo mutatore in Point
.
CREATE ASSEMBLY mytest FROM 'c:\test.dll' WITH PERMISSION_SET = SAFE
CREATE TYPE Point EXTERNAL NAME mytest.Point
GO
DECLARE @p Point = CONVERT(Point, '')
SET @p.SetXY(22, 23);
Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)
Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022
o AdventureWorksDW2022
, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.
J. Stampare il valore di una variabile inizializzata tramite SET
Nell'esempio seguente viene creata la variabile @myVar
, viene immesso un valore stringa nella variabile e quindi viene visualizzato il valore della variabile @myVar
.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT TOP 1 @myVar FROM sys.databases;
K. Usare una variabile locale assegnata a un valore usando SET in un'istruzione SELECT
L'esempio seguente crea una variabile locale denominata @dept
e usa questa variabile locale in un'istruzione SELECT
per trovare il nome (FirstName
) e il nome della famiglia (LastName
) di tutti i dipendenti che lavorano nel Marketing
reparto.
DECLARE @dept CHAR(25);
SET @dept = N'Marketing';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name
FROM DimEmployee
WHERE DepartmentName = @dept;
.L Usare un'assegnazione composta per una variabile locale
I due esempi seguenti consentono di ottenere lo stesso risultato. In questi esempi viene creata una variabile locale denominata @NewBalance
, quindi la variabile viene moltiplicata per 10
e il nuovo valore della variabile locale viene visualizzato in un'istruzione SELECT
. Nel secondo esempio viene utilizzato un operatore di assegnazione composto.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
M. Assegnare un valore da una query
Nell'esempio seguente viene utilizzata una query per assegnare un valore a una variabile.
-- Uses AdventureWorks
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM dbo.DimCustomer);
SELECT TOP 1 @rows FROM sys.tables;