DECLARE (Transact-SQL)DECLARE (Transact-SQL)

QUESTO ARGOMENTO SI APPLICA A: SìSQL Server (a partire da 2008)SìDatabase SQL di AzureSìAzure SQL Data Warehouse Sì Parallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

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.Variables are declared in the body of a batch or procedure with the DECLARE statement and are assigned values by using either a SET or SELECT statement. È possibile dichiarare variabili di cursore con questa istruzione e utilizzarle insieme ad altre istruzioni correlate ai cursori.Cursor variables can be declared with this statement and used with other cursor-related statements. Dopo la dichiarazione, tutte le variabili vengono inizializzate con valore NULL, a meno che non venga fornito un valore nella dichiarazione.After declaration, all variables are initialized as NULL, unless a value is provided as part of the declaration.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

-- Syntax for SQL Server and Azure SQL Database  

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

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

<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 )   
     | WITH ( <index_option > )  
     }   

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

<index_option> ::=  
See CREATE TABLE for index option syntax.  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

DECLARE   
{{ @local_variable [AS] data_type } [ =value [ COLLATE <collation_name> ] ] } [,...n]  

ArgomentiArguments

@local_variable@local_variable
Nome di una variabile.Is the name of a variable. I nomi di variabile devono iniziare con un simbolo di chiocciola (@).Variable names must begin with an at (@) sign. I nomi delle variabili locali devono essere conformi alle regole per gli identificatori.Local variable names must comply with the rules for identifiers.

data_typedata_type
Qualsiasi tipo di tabella di sistema, CLR (Common Language Runtime) definito dall'utente o tipo di dati alias.Is any system-supplied, common language runtime (CLR) user-defined table type, or alias data type. Una variabile non può essere di un tipo di dati text, ntext o image.A variable cannot be of text, ntext, or image data type.

Per altre informazioni sui tipi di dati di sistema, vedere Tipi di dati (Transact-SQL).For more information about system data types, see Data Types (Transact-SQL). Per altre informazioni sui tipi CLR definiti dall'utente o sui tipi di dati alias, vedere CREATE TYPE (Transact-SQL).For more information about CLR user-defined types or alias data types, see CREATE TYPE (Transact-SQL).

=value=value
Assegna un valore alla variabile inline.Assigns a value to the variable in-line. 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.The value can be a constant or an expression, but it must either match the variable declaration type or be implicitly convertible to that type. Per altre informazioni, vedere Espressioni (Transact-SQL).For more information, see Expressions (Transact-SQL).

@cursor_variable_name@cursor_variable_name
Nome di una variabile di cursore.Is the name of a cursor variable. I nomi delle variabili di cursore devono iniziare con un simbolo di chiocciola (@) e devono essere conformi alle regole per gli identificatori.Cursor variable names must begin with an at (@) sign and conform to the rules for identifiers.

CURSORCURSOR
Specifica che si tratta di una variabile di cursore locale.Specifies that the variable is a local cursor variable.

@table_variable_name@table_variable_name
Nome di una variabile di tipo table.Is the name of a variable of type table. I nomi delle variabili devono iniziare con un simbolo di chiocciola (@) e devono essere conformi alle regole per gli identificatori.Variable names must begin with an at (@) sign and conform to the rules for identifiers.

<table_type_definition><table_type_definition>
Definisce il tipo di dati table.Defines the table data type. La dichiarazione di tabella include definizioni di colonna, nomi, tipi di dati e vincoli.The table declaration includes column definitions, names, data types, and constraints. Gli unici tipi di vincolo consentiti sono PRIMARY KEY, UNIQUE, NULL e CHECK.The only constraint types allowed are PRIMARY KEY, UNIQUE, NULL, and 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.An alias data type cannot be used as a column scalar data type if a rule or default definition is bound to the type.

<table_type_definiton> è un subset di informazioni usate per definire una tabella nell'istruzione CREATE TABLE.<table_type_definiton> Is a subset of information used to define a table in CREATE TABLE. Queste informazioni includono elementi e definizioni essenziali.Elements and essential definitions are included here. Per altre informazioni, vedere CREATE TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL).

nn
Segnaposto che indica che è possibile specificare più variabili e assegnare i relativi valori.Is a placeholder indicating that multiple variables can be specified and assigned values. Quando si dichiarano variabili di tipo table, la variabile table deve essere l'unica dichiarata nell'istruzione DECLARE.When declaring table variables, the table variable must be the only variable being declared in the DECLARE statement.

column_namecolumn_name
Nome della colonna della tabella.Is the name of the column in the table.

scalar_data_typescalar_data_type
Specifica che il tipo di dati della colonna è scalare.Specifies that the column is a scalar data type.

computed_column_expressioncomputed_column_expression
Espressione che determina il valore di una colonna calcolata.Is an expression defining the value of a computed column. Il valore viene calcolato in base a un'espressione che utilizza altre colonne della stessa tabella.It is computed from an expression using other columns in the same table. La definizione di una colonna calcolata può ad esempio essere costo AS prezzo * quantità. 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.For example, a computed column can have the definition cost AS price * qty. The expression can be a noncomputed column name, constant, built-in function, variable, or any combination of these connected by one or more operators. Non può invece essere una sottoquery o una funzione definita dall'utente.The expression cannot be a subquery or a user-defined function. Non può inoltre fare riferimento a un tipo CLR definito dall'utente.The expression cannot reference a CLR user-defined type.

[ COLLATE collation_name][ COLLATE collation_name]
Specifica le regole di confronto per la colonna.Specifies the collation for the column. collation_name può essere un nome di regole di confronto di Windows o SQL ed è applicabile solo alle colonne dei tipi di dati char, varchar, text, nchar, nvarchar e ntext.collation_name can be either a Windows collation name or an SQL collation name, and is applicable only for columns of the char, varchar, text, nchar, nvarchar, and ntext data types. 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.If not specified, the column is assigned either the collation of the user-defined data type (if the column is of a user-defined data type) or the collation of the current database.

Per altre informazioni sui nomi delle regole di confronto di Windows e SQL, vedere COLLATE (Transact-SQL).For more information about the Windows and SQL collation names, see COLLATE (Transact-SQL).

DEFAULTDEFAULT
Specifica il valore assegnato alla colonna quando non viene specificato un valore in modo esplicito durante un inserimento.Specifies the value provided for the column when a value is not explicitly supplied during an insert. È possibile applicare le definizioni DEFAULT a qualsiasi colonna, ad eccezione di quelle definite come timestamp o con la proprietà IDENTITY.DEFAULT definitions can be applied to any columns except those defined as timestamp or those with the IDENTITY property. Le definizioni DEFAULT vengono rimosse quando la tabella viene eliminata.DEFAULT definitions are removed when the table is dropped. Come valore predefinito è possibile utilizzare solo una costante, ad esempio una stringa di caratteri, una funzione di sistema, ad esempio SYSTEM_USER(), oppure NULL.Only a constant value, such as a character string; a system function, such as a SYSTEM_USER(); or NULL can be used as a default. Per garantire la compatibilità con le versioni precedenti di SQL ServerSQL Server, è possibile assegnare un nome di vincolo a una definizione DEFAULT.To maintain compatibility with earlier versions of SQL ServerSQL Server, a constraint name can be assigned to a DEFAULT.

constant_expressionconstant_expression
Costante, valore NULL o funzione di sistema utilizzata come valore predefinito della colonna.Is a constant, NULL, or a system function used as the default value for the column.

IDENTITYIDENTITY
Indica che la nuova colonna è una colonna Identity.Indicates that the new column is an identity column. Quando si aggiunge una nuova riga alla tabella, SQL ServerSQL Server assegna un valore univoco e incrementale alla colonna.When a new row is added to the table, SQL ServerSQL Server provides a unique incremental value for the column. Le colonne Identity vengono comunemente utilizzate in combinazione con vincoli PRIMARY KEY per fungere da identificatore di riga univoco per la tabella.Identity columns are commonly used in conjunction with PRIMARY KEY constraints to serve as the unique row identifier for the table. La proprietà IDENTITY può essere assegnata a colonne tinyint, smallint, int, decimal(p,0) o numeric(p,0).The IDENTITY property can be assigned to tinyint, smallint, int, decimal(p,0), or numeric(p,0) columns. Ogni tabella può includere una sola colonna Identity.Only one identity column can be created per table. Non è consentito associare valori predefiniti e vincoli DEFAULT alle colonne Identity.Bound defaults and DEFAULT constraints cannot be used with an identity column. È necessario specificare sia il valore di inizializzazione che l'incremento oppure è possibile omettere entrambi questi valori.You must specify both the seed and increment, or neither. In questo secondo caso, il valore predefinito è (1,1).If neither is specified, the default is (1,1).

seedseed
Valore di inizializzazione utilizzato per la prima riga caricata nella tabella.Is the value used for the very first row loaded into the table.

incrementincrement
Valore incrementale aggiunto al valore Identity della riga caricata in precedenza.Is the incremental value added to the identity value of the previous row that was loaded.

ROWGUIDCOLROWGUIDCOL
Specifica che la nuova colonna funge da identificatore di riga univoco globale.Indicates that the new column is a row global unique identifier column. È possibile designare come colonna ROWGUIDCOL una sola colonna di tipo uniqueidentifier per ogni tabella.Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column. La proprietà ROWGUIDCOL può essere assegnata solo a una colonna uniqueidentifier.The ROWGUIDCOL property can be assigned only to a uniqueidentifier column.

NULL | NOT NULLNULL | NOT NULL
Indica se il valore Null è ammesso nella variabile.Indicates if null is allowed in the variable. Il valore predefinito è NULL.The default is NULL.

PRIMARY KEYPRIMARY KEY
Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco.Is a constraint that enforces entity integrity for a given column or columns through a unique index. È possibile creare un solo vincolo PRIMARY KEY per ogni tabella.Only one PRIMARY KEY constraint can be created per table.

UNIQUEUNIQUE
Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco.Is a constraint that provides entity integrity for a given column or columns through a unique index. Una tabella può includere più vincoli UNIQUE.A table can have multiple UNIQUE constraints.

CHECKCHECK
Vincolo che impone l'integrità di dominio tramite la limitazione dei valori che è possibile inserire in una o più colonne.Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns.

logical_expressionlogical_expression
Espressione logica che restituisce TRUE o FALSE.Is a logical expression that returns TRUE or FALSE.

RemarksRemarks

Le variabili spesso vengono utilizzate in un batch o una procedura come contatori per istruzioni WHILE e LOOP oppure per un blocco IF...ELSE.Variables are often used in a batch or procedure as counters for WHILE, LOOP, or for an IF...ELSE block.

Le variabili possono essere utilizzate solo nelle espressioni e non in sostituzione di parole chiave o nomi di oggetto.Variables can be used only in expressions, not in place of object names or keywords. Per creare istruzioni SQL dinamiche, utilizzare EXECUTE.To construct dynamic SQL statements, use EXECUTE.

L'ambito di una variabile locale è il batch in cui viene dichiarata.The scope of a local variable is the batch in which it is declared.

Una variabile di tabella non è necessariamente residente in memoria.A table variable is not necessarily memory resident. In situazioni di utilizzo elevato di memoria è possibile che per le pagine appartenenti a una variabile di tabella venga eseguito il push a tempdb.Under memory pressure, the pages belonging to a table variable can be pushed out to tempdb.

Nelle seguenti istruzioni è possibile fare riferimento come origine a una variabile di cursore a cui è assegnato un cursore:A cursor variable that currently has a cursor assigned to it can be referenced as a source in a:

  • Istruzione CLOSE.CLOSE statement.

  • Istruzione DEALLOCATE.DEALLOCATE statement.

  • Istruzione FETCH.FETCH statement.

  • Istruzione OPEN.OPEN statement.

  • Istruzione DELETE o UPDATE posizionata.Positioned DELETE or UPDATE statement.

  • Istruzione SET CURSOR con variabile (nella parte destra).SET CURSOR variable statement (on the right side).

    Se la variabile di cursore a cui viene fatto riferimento in queste istruzioni esiste ma non le è stato assegnato un cursore, in SQL ServerSQL Server viene generato un errore.In all of these statements, SQL ServerSQL Server raises an error if a referenced cursor variable exists but does not have a cursor currently allocated to it. Se la variabile di cursore a cui viene fatto riferimento non esiste, in SQL ServerSQL Server viene restituito lo stesso errore generato per le variabili non dichiarate di altro tipo.If a referenced cursor variable does not exist, SQL ServerSQL Server raises the same error raised for an undeclared variable of another type.

    Una variabile di cursore:A cursor variable:

  • Può essere la destinazione di un tipo di cursore o di un'altra variabile di cursore.Can be the target of either a cursor type or another cursor variable. Per altre informazioni, vedere SET @local_variable (Transact-SQL).For more information, see 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.Can be referenced as the target of an output cursor parameter in an EXECUTE statement if the cursor variable does not have a cursor currently assigned to it.

  • Deve essere considerata come puntatore al cursore.Should be regarded as a pointer to the cursor.

EsempiExamples

A.A. Utilizzo di DECLAREUsing 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.The following example uses a local variable named @find to retrieve contact information for all last names beginning with Man.

USE AdventureWorks2012;  
GO  
DECLARE @find varchar(30);   
/* Also allowed:   
DECLARE @find varchar(30) = 'Man%';   
*/  
SET @find = 'Man%';   
SELECT p.LastName, p.FirstName, ph.PhoneNumber  
FROM Person.Person AS p   
JOIN Person.PersonPhone AS ph ON p.BusinessEntityID = ph.BusinessEntityID  
WHERE LastName LIKE @find;  

Set di risultati:Here is the result set.

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.B. Utilizzo di DECLARE con due variabiliUsing DECLARE with two variables

Nell'esempio seguente vengono recuperati i nomi dei rappresentanti di Adventure Works CyclesAdventure Works Cycles che svolgono la propria attività nel Nord America e per cui l'ammontare delle vendite annue è pari almeno a $ 2.000.000.The following example retrieves the names of Adventure Works CyclesAdventure Works Cycles sales representatives who are located in the North American sales territory and have at least $2,000,000 in sales for the year.

USE AdventureWorks2012;  
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.C. Dichiarazione di una variabile di tipo tableDeclaring a variable of type table

Nell'esempio seguente viene creata una variabile di tipo table in cui vengono archiviati i valori specificati nella clausola OUTPUT dell'istruzione UPDATE.The following example creates a table variable that stores the values specified in the OUTPUT clause of the UPDATE statement. Questa variabile è seguita da due istruzioni SELECT che restituiscono i valori in @MyTableVar e i risultati dell'operazione di aggiornamento nella tabella Employee.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. Si noti che i risultati nella colonna INSERTED.ModifiedDate sono diversi rispetto ai valori nella colonna ModifiedDate della tabella Employee.Note that the results in the INSERTED.ModifiedDate column differ from the values in the ModifiedDate column in the Employee table. Questo perché nella tabella AFTER UPDATE è stato definito il trigger ModifiedDate, che aggiorna il valore di Employee in base alla data corrente.This is because the AFTER UPDATE trigger, which updates the value of ModifiedDate to the current date, is defined on the Employee table. Le colonne restituite da OUTPUT, tuttavia, riflettono i dati prima dell'attivazione dei trigger.However, the columns returned from OUTPUT reflect the data before triggers are fired. Per altre informazioni, vedere Clausola OUTPUT (Transact-SQL).For more information, see OUTPUT Clause (Transact-SQL).

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    OldVacationHours int,  
    NewVacationHours int,  
    ModifiedDate datetime);  
UPDATE TOP (10) HumanResources.Employee  
SET VacationHours = VacationHours * 1.25   
OUTPUT INSERTED.BusinessEntityID,  
       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.  
--Note that ModifiedDate reflects the value generated by an  
--AFTER UPDATE trigger.  
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate  
FROM HumanResources.Employee;  
GO  

D.D. Dichiarazione di una variabile di tipo di tabella definito dall'utenteDeclaring a variable of user-defined table type

Nell'esempio seguente viene creato un parametro con valori di tabella o una variabile di tabella denominata @LocationTVP.The following example creates a table-valued parameter or table variable called @LocationTVP. A tale scopo è necessario un tipo di tabella definito dall'utente corrispondente denominato LocationTableType.This requires a corresponding user-defined table type called LocationTableType. Per altre informazioni sulla creazione di un tipo di tabella definito dall'utente, vedere CREATE TYPE (Transact-SQL).For more information about how to create a user-defined table type, see CREATE TYPE (Transact-SQL). Per altre informazioni sui parametri con valori di tabella, vedere Usare parametri con valori di tabella (motore di database).For more information about table-valued parameters, see Use Table-Valued Parameters (Database Engine).

DECLARE @LocationTVP   
AS LocationTableType;  

Esempi: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

E.E. Utilizzo di DECLAREUsing DECLARE

Nell'esempio seguente viene utilizzata una variabile locale denominata @find per recuperare le informazioni sul contatto per tutti i cognomi che iniziano con Walt.The following example uses a local variable named @find to retrieve contact information for all last names beginning with Walt.

-- Uses AdventureWorks  

DECLARE @find varchar(30);  
/* Also allowed:   
DECLARE @find varchar(30) = 'Man%';  
*/  
SET @find = 'Walt%';  

SELECT LastName, FirstName, Phone  
FROM DimEmployee   
WHERE LastName LIKE @find;  

F.F. Utilizzo di DECLARE con due variabiliUsing DECLARE with two variables

Nell'esempio seguente vengono recuperate le variabili utente per specificare i nomi e i cognomi dei dipendenti inclusi nella tabella DimEmployee.The following example retrieves uses variables to specify the first and last names of employees in the DimEmployee table.

-- Uses AdventureWorks  

DECLARE @lastName varchar(30), @firstName varchar(30);  

SET @lastName = 'Walt%';  
SET @firstName = 'Bryan';  

SELECT LastName, FirstName, Phone  
FROM DimEmployee   
WHERE LastName LIKE @lastName AND FirstName LIKE @firstName;  

Vedere ancheSee Also

EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
Funzioni predefinite (Transact-SQL) Built-in Functions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
table (Transact-SQL) table (Transact-SQL)
Confrontare dati XML tipizzati con dati XML non tipizzatiCompare Typed XML to Untyped XML