DECLARE @local_variable (Transact-SQL)

Le variabili vengono dichiarate nel corpo di un batch o di una routine tramite l'istruzione DECLARE e i relativi valori vengono assegnati tramite un'istruzione SET o SELECT. È possibile dichiarare variabili di cursore con questa istruzione e utilizzarle insieme ad altre istruzioni correlate ai cursori. Dopo la dichiarazione, tutte le variabili vengono inizializzate con valore NULL, a meno che non venga fornito un valore nella dichiarazione.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

DECLARE 
     { 
{{ @local_variable [AS] data_type } | [ = value ] }
    | { @cursor_variable_name CURSOR }
} [,...n] 
    | { @table_variable_name [AS] <table_type_definition> | <user-defined table type> } 

<table_type_definition> ::= 
     TABLE ( { <column_definition> | <table_constraint> } [ ,... ] 
      ) 

<column_definition> ::= 
          column_name { scalar_data_type | AS computed_column_expression }
     [ COLLATE collation_name ] 
     [ [ DEFAULT constant_expression ] | IDENTITY [ ( seed ,increment ) ] ] 
     [ ROWGUIDCOL ] 
     [ <column_constraint> ] 

<column_constraint> ::= 
     { [ NULL | NOT NULL ] 
     | [ PRIMARY KEY | UNIQUE ] 
     | CHECK ( logical_expression ) 
     } 

<table_constraint> ::= 
     { { PRIMARY KEY | UNIQUE } ( column_name [ ,... ] ) 
     | CHECK ( search_condition ) 
     } 

Argomenti

  • @local_variable
    Nome di una variabile. I nomi di variabile devono iniziare con un simbolo di chiocciola (
    @
    ). I nomi delle variabili locali devono essere conformi alle regole per gli identificatori.

  • data_type
    Qualsiasi tipo di tabella di sistema, CLR (Common Language Runtime) definito dall'utente o tipo di dati alias. Il tipo di dati di una variabile non può essere text, ntext o image.

    Per ulteriori informazioni sui tipi di dati di sistema, vedere Tipi di dati (Transact-SQL). Per ulteriori informazioni sui tipi di dati CLR definiti dall'utente o alias, vedere CREATE TYPE (Transact-SQL).

  • = value
    Assegna un valore alla variabile inline. Il valore può essere una costante o un'espressione, ma deve corrispondere al tipo di dichiarazione di variabile o deve supportare la conversione implicita in tale tipo.

  • @cursor_variable_name
    Nome di una variabile di cursore. I nomi delle variabili di cursore devono iniziare con un simbolo di chiocciola (
    @
    ) e devono essere conformi alle regole per gli identificatori.

  • CURSOR
    Specifica che si tratta di una variabile di cursore locale.

  • @table_variable_name
    Nome di una variabile di tipo table. I nomi delle variabili devono iniziare con un simbolo di chiocciola (
    @
    ) e devono essere conformi alle regole per gli identificatori.

  • <table_type_definition>
    Definisce il tipo di dati table. La dichiarazione di tabella include definizioni di colonna, nomi, tipi di dati e vincoli. Gli unici tipi di vincolo consentiti sono PRIMARY KEY, UNIQUE, NULL e CHECK. Non è possibile utilizzare un tipo di dati alias come tipo di dati scalare di una colonna se al tipo è associata una regola o una definizione di valore predefinito.

    <table_type_definition> è un subset di informazioni utilizzate per definire una tabella nell'istruzione CREATE TABLE. Queste informazioni includono elementi e definizioni essenziali. Per ulteriori informazioni, vedere CREATE TABLE (Transact-SQL).

  • n
    Segnaposto che indica che è possibile specificare più variabili e assegnare i relativi valori. Quando si dichiarano variabili di tipo table, la variabile table deve essere l'unica dichiarata nell'istruzione DECLARE.

  • column_name
    Nome della colonna della tabella.

  • scalar_data_type
    Specifica che il tipo di dati della colonna è scalare.

  • computed_column_expression
    Espressione che determina il valore di una colonna calcolata. Il valore viene calcolato in base a un'espressione che utilizza altre colonne della stessa tabella. La definizione di una colonna calcolata potrebbe ad esempio essere cost AS price * qty. L'espressione può essere un nome di colonna non calcolata, una costante, una funzione predefinita, una variabile o una qualsiasi combinazione di questi elementi uniti da uno o più operatori. Non può invece essere una sottoquery o una funzione definita dall'utente. Non può inoltre fare riferimento a un tipo CLR definito dall'utente.

  • [ COLLATE collation_name]
    Specifica le regole di confronto per la colonna. collation_name può essere un nome di regole di confronto Windows o SQL e si applica solo alle colonne con tipi di datichar, varchar, text, nchar, nvarchar e ntext. Se viene omesso, alla colonna vengono assegnate le regole di confronto del tipo di dati definito dall'utente, se il tipo di dati della colonna è definito dall'utente, oppure le regole di confronto del database corrente.

    Per ulteriori informazioni sui nomi di regole di confronto Windows e SQL, vedere COLLATE (Transact-SQL).

  • DEFAULT
    Specifica il valore assegnato alla colonna quando non viene specificato un valore in modo esplicito durante un inserimento. È possibile applicare le definizioni DEFAULT a qualsiasi colonna, ad eccezione di quelle definite come timestamp o con la proprietà IDENTITY. Le definizioni DEFAULT vengono rimosse quando la tabella viene eliminata. Come valore predefinito è possibile utilizzare solo una costante, ad esempio una stringa di caratteri, una funzione di sistema, ad esempio SYSTEM_USER(), oppure NULL. Per garantire la compatibilità con le versioni precedenti di SQL Server, è possibile assegnare un nome di vincolo a una definizione DEFAULT.

  • constant_expression
    Costante, valore NULL o funzione di sistema utilizzata come valore predefinito della colonna.

  • IDENTITY
    Indica che la nuova colonna è una colonna Identity. Quando si aggiunge una nuova riga alla tabella, SQL Server assegna un valore univoco e incrementale alla colonna. Le colonne Identity vengono comunemente utilizzate in combinazione con vincoli PRIMARY KEY per fungere da identificatore di riga univoco per la tabella. La proprietà IDENTITY può essere assegnata alle colonne tinyint, smallint, int, decimal(p,0) o numeric(p,0). Ogni tabella può includere una sola colonna Identity. Non è consentito associare valori predefiniti e vincoli DEFAULT alle colonne Identity. È necessario specificare sia il valore di inizializzazione che l'incremento oppure è possibile omettere entrambi questi valori. In questo secondo caso, il valore predefinito è (1,1).

  • seed
    Valore di inizializzazione utilizzato per la prima riga caricata nella tabella.

  • increment
    Valore incrementale aggiunto al valore Identity della riga caricata in precedenza.

  • ROWGUIDCOL
    Specifica che la nuova colonna funge da identificatore di riga univoco globale. È possibile designare come colonna ROWGUIDCOL una sola colonna di tipo uniqueidentifier per ogni tabella. La proprietà ROWGUIDCOL può essere assegnata solo a una colonna uniqueidentifier.

  • NULL | NOT NULL
    Parole chiave che determinano se la colonna ammette o meno valori Null.

  • PRIMARY KEY
    Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco. È possibile creare un solo vincolo PRIMARY KEY per ogni tabella.

  • UNIQUE
    Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco. Una tabella può includere più vincoli UNIQUE.

  • CHECK
    Vincolo che impone l'integrità di dominio tramite la limitazione dei valori che è possibile immettere in una o più colonne.

  • logical_expression
    Espressione logica che restituisce TRUE o FALSE.

  • <<tipo di tabella definito dall'utente>>
    Specifica che la variabile è un tipo di tabella definito dall'utente.

Osservazioni

Le variabili spesso vengono utilizzate in un batch o una procedura come contatori per istruzioni WHILE e LOOP oppure per un blocco IF...ELSE.

Le variabili possono essere utilizzate solo nelle espressioni e non in sostituzione di parole chiave o nomi di oggetto. Per creare istruzioni SQL dinamiche, utilizzare EXECUTE.

L'ambito di una variabile locale è il batch in cui viene dichiarata.

Nelle seguenti istruzioni è possibile fare riferimento come origine a una variabile di cursore a cui è assegnato un cursore:

  • Istruzione CLOSE.

  • Istruzione DEALLOCATE.

  • Istruzione FETCH.

  • Istruzione OPEN.

  • Istruzione DELETE o UPDATE posizionata.

  • Istruzione SET CURSOR con variabile (nella parte destra).

Se la variabile di cursore a cui viene fatto riferimento in queste istruzioni esiste ma non le è stato assegnato un cursore, in SQL Server viene generato un errore. Se la variabile di cursore a cui viene fatto riferimento non esiste, in SQL Server viene restituito lo stesso errore generato per le variabili non dichiarate di altro tipo.

Una variabile di cursore:

  • Può essere la destinazione di un tipo di cursore o di un'altra variabile di cursore. Per ulteriori informazioni, vedere SET @local\_variable (Transact-SQL).

  • Può essere specificata come destinazione di un parametro di cursore di output in un'istruzione EXECUTE se alla variabile di cursore non è attualmente assegnato un cursore.

  • Deve essere considerata come puntatore al cursore. Per ulteriori informazioni sulle variabili di cursore, vedere Cursori Transact-SQL.

Esempi

A. Utilizzo di DECLARE

Nell'esempio seguente viene utilizzata una variabile locale denominata @find per recuperare le informazioni sul contatto per tutti i cognomi che iniziano con Man.

USE AdventureWorks;
GO
DECLARE @find varchar(30);
/* Also allowed: 
DECLARE @find varchar(30) = 'Man%';
*/
SET @find = 'Man%';
SELECT LastName, FirstName, Phone
FROM Person.Contact
WHERE LastName LIKE @find;

Set di risultati:

LastName            FirstName               Phone                     
-------------------------------------------------- -------------------------------------------------- ------------------------- 
Manchepalli         Ajay                    1 (11) 500 555-0174
Manek               Parul                   1 (11) 500 555-0146
Manzanares          Tomas                   1 (11) 500 555-0178
(3 row(s) affected)

B. Utilizzo di DECLARE con due variabili

Nell'esempio seguente vengono recuperati i nomi dei rappresentanti di Adventure Works Cycles che svolgono la propria attività nel Nord America e per cui l'ammontare delle vendite annue è pari almeno a $ 2.000.000.

USE AdventureWorks;
GO
SET NOCOUNT ON;
GO
DECLARE @Group nvarchar(50), @Sales money;
SET @Group = N'North America';
SET @Sales = 2000000;
SET NOCOUNT OFF;
SELECT FirstName, LastName, SalesYTD
FROM Sales.vSalesPerson
WHERE TerritoryGroup = @Group and SalesYTD >= @Sales;

C. Dichiarazione di una variabile di tipo table

Nell'esempio seguente viene creata una variabile di tipo table in cui vengono archiviati i valori specificati nella clausola OUTPUT dell'istruzione UPDATE. Questa variabile è seguita da due istruzioni SELECT che restituiscono i valori in @MyTableVar e i risultati dell'operazione di aggiornamento nella tabella Employee. Si noti che i risultati nella colonna INSERTED.ModifiedDate sono diversi rispetto ai valori nella colonna ModifiedDate della tabella Employee . Questo perché nella tabella Employee è stato definito il trigger AFTER UPDATE, che aggiorna il valore di ModifiedDate in base alla data corrente. Le colonne restituite da OUTPUT, tuttavia, riflettono i dati prima dell'attivazione dei trigger. Per ulteriori informazioni, vedere Clausola OUTPUT (Transact-SQL).

USE AdventureWorks;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE() 
OUTPUT inserted.EmployeeID,
       deleted.VacationHours,
       inserted.VacationHours,
       inserted.ModifiedDate
INTO @MyTableVar;

--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO

--Display the result set of the table.
SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

D. Dichiarazione di una variabile di tipo di tabella definito dall'utente

Nell'esempio seguente viene creato un parametro valutato a livello di tabella o una variabile di tabella denominato @LocationTVP. A tale scopo è necessario un tipo di tabella definito dall'utente corrispondente denominato LocationTableType. Per ulteriori informazioni sulla creazione di un tipo di tabella definito dall'utente, vedere CREATE TYPE (Transact-SQL). Per ulteriori informazioni sui parametri con valori di tabella, vedere Parametri con valori di tabella (Motore di database).

DECLARE @LocationTVP 
AS LocationTableType;