DECLARE @local_variable (Transact-SQL)

Data aggiornamento: 5 dicembre 2005

Le variabili vengono dichiarate nel corpo di un batch o una procedura 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 come valori Null.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

< 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. Per ulteriori informazioni, vedere Utilizzo degli identificatori come nomi di oggetti.
  • data_type
    Qualsiasi tipo di dati di sistema, CLR (Common Language Runtime) definito dall'utente o alias. Una variabile non può essere di tipo 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).
  • ****@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.

  • 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 subquery 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 della colonna. collation_name può essere un nome di regole di confronto di Windows oppure di SQL e viene applicato solo alle colonne di tipo char, 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 di Windows e SQL, vedere COLLATE.

  • DEFAULT
    Specifica il valore assegnato alla colonna quando non viene specificato un valore in modo esplicito durante un inserimento. È possibile applicare 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 a colonne di tipo 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 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 supporta 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.

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 associato un cursore, in Microsoft 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.

I valori delle variabili di cursore non cambiano dopo la dichiarazione di un cursore. In SQL Server versione 6.5 e precedente i valori di variabile vengono aggiornati ogni volta che viene riaperto un cursore.

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.
  • 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 di contatto per tutti i cognomi che iniziano con "Man".

USE AdventureWorks;
GO
DECLARE @find varchar(30);
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 è almeno pari 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. Utilizzo di DECLARE per 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 altri esempi sull'utilizzo della clausola OUTPUT, 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 
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.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

Vedere anche

Riferimento

EXECUTE (Transact-SQL)
Funzioni (Transact-SQL)
SELECT (Transact-SQL)
table (Transact-SQL)

Altre risorse

Codice XML tipizzato e non tipizzato
Modifica dei valori di variabili e parametri di un tipo definito dall'utente

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

5 dicembre 2005

Nuovo contenuto
  • Chiarimento dell'impossibilità di fare riferimento a un tipo CLR definito dall'utente nell'argomento computed_column_expression.