Condividi tramite


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 bit AND e assegna
  • ^= - Bit per bit XOR e assegna
  • |= - Bit per bit OR 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, PRIORNEXT, RELATIVE, e ABSOLUTE. Non è possibile specificare SCROLL quando si specifica FAST_FORWARDanche .

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 STATICparole chiave , KEYSETo 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, KEYSETo DYNAMIC. Per STATICi cursori , KEYSETe 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_ONLYcursore , 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 BROWSEall'interno del select_statement di una dichiarazione di cursore.

Se si usa DISTINCT, UNIONGROUP BY, o HAVINGo 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, SELECTe 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;