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

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Las variables se declaran en el cuerpo de un proceso por lotes o un procedimiento con la instrucción DECLARE, y se les asignan valores con una instrucción 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. Las variables de cursor pueden declararse con esta instrucción y utilizarse con otras instrucciones relacionadas con los cursores.Cursor variables can be declared with this statement and used with other cursor-related statements. Después de la declaración, todas las variables se inicializan como NULL, a menos que se proporcione un valor como parte de la declaración.After declaration, all variables are initialized as NULL, unless a value is provided as part of the declaration.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- 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]  
  

ArgumentosArguments

@local_variable@local_variable
Es el nombre de una variable.Is the name of a variable. Los nombres de variables deben comenzar con un signo de arroba (@).Variable names must begin with an at (@) sign. Los nombres de las variables locales deben respetar las reglas de los identificadores.Local variable names must comply with the rules for identifiers.

data_typedata_type
Es cualquier tipo de tabla definido por el usuario CLR (Common Language Runtime) o tipo de datos de alias, suministrado por el sistema.Is any system-supplied, common language runtime (CLR) user-defined table type, or alias data type. Una variable no puede estar enlazada con los tipos de datos text, ntext o image.A variable cannot be of text, ntext, or image data type.

Para más información sobre los tipos de datos del sistema, vea Tipos de datos (Transact-SQL).For more information about system data types, see Data Types (Transact-SQL). Para más información sobre los tipos de datos definidos por el usuario CLR o de alias, vea CREATE TYPE (Transact-SQL).For more information about CLR user-defined types or alias data types, see CREATE TYPE (Transact-SQL).

=value=value
Asigna un valor a la variable en línea.Assigns a value to the variable in-line. El valor puede ser una constante o una expresión, pero debe coincidir con el tipo de declaración de la variable o poder convertirse implícitamente a ese 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. Para obtener más información, vea Expresiones (Transact-SQL).For more information, see Expressions (Transact-SQL).

@cursor_variable_name@cursor_variable_name
Es el nombre de una variable de cursor.Is the name of a cursor variable. Los nombres de variable de cursor deben comenzar con un signo de arroba (@) y seguir las reglas de los identificadores.Cursor variable names must begin with an at (@) sign and conform to the rules for identifiers.

CURSORCURSOR
Especifica que la variable es una variable de cursor local.Specifies that the variable is a local cursor variable.

@table_variable_name@table_variable_name
Es el nombre de una variable de tipo table.Is the name of a variable of type table. Los nombres de variable deben comenzar con un signo de arroba (@) y seguir las reglas de los identificadores.Variable names must begin with an at (@) sign and conform to the rules for identifiers.

<table_type_definition><table_type_definition>
Define el tipo de datos de table.Defines the table data type. La declaración de tabla incluye definiciones de columna, nombres, tipos de datos y restricciones.The table declaration includes column definitions, names, data types, and constraints. Solo se permiten los tipos de restricciones PRIMARY KEY, UNIQUE, NULL y CHECK.The only constraint types allowed are PRIMARY KEY, UNIQUE, NULL, and CHECK. Un tipo de datos de alias no puede usarse como un tipo de datos de columna escalar si una regla o definición de valor predeterminado está enlazada al tipo.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> es un subconjunto de información que se usa para definir una tabla en CREATE TABLE.<table_type_definiton> Is a subset of information used to define a table in CREATE TABLE. Aquí se incluyen los elementos y definiciones fundamentales.Elements and essential definitions are included here. Para obtener más información, vea CREATE TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL).

nn
Es un marcador de posición que indica que se pueden especificar y asignar valores a varias variables.Is a placeholder indicating that multiple variables can be specified and assigned values. Cuando se declara una variable de table, esta debe ser la única variable de table que se declara en la instrucción DECLARE.When declaring table variables, the table variable must be the only variable being declared in the DECLARE statement.

column_namecolumn_name
Es el nombre de la columna de la tabla.Is the name of the column in the table.

scalar_data_typescalar_data_type
Especifica que la columna es de un tipo de datos escalar.Specifies that the column is a scalar data type.

computed_column_expressioncomputed_column_expression
Es una expresión que define el valor de una columna calculada.Is an expression defining the value of a computed column. Se calcula a partir de una expresión mediante otras columnas de la misma tabla.It is computed from an expression using other columns in the same table. Por ejemplo, una columna calculada puede tener la definición cost AS price * qty. La expresión puede ser un nombre de columna no calculada, una constante, una función integrada, una variable o cualquier combinación de estos elementos conectados mediante uno o más operadores.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. La expresión no puede ser una subconsulta o una función definida por el usuario.The expression cannot be a subquery or a user-defined function. La expresión no puede hacer referencia a un tipo CLR definido por el usuario.The expression cannot reference a CLR user-defined type.

[ COLLATE collation_name][ COLLATE collation_name]
Especifica la intercalación de la columna.Specifies the collation for the column. collation_name puede ser un nombre de intercalación de Windows o un nombre de intercalación de SQL, y solo es aplicable a las columnas de los tipos de datos char, varchar, text, nchar, nvarchar y 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. Si no se especifica, se asignará a la columna la intercalación del tipo de datos definido por el usuario, si la columna es de un tipo de datos definido por el usuario, o la intercalación de la base de datos actual.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.

Para obtener más información sobre los nombres de intercalación de Windows y SQL, vea COLLATE (Transact-SQL).For more information about the Windows and SQL collation names, see COLLATE (Transact-SQL).

DEFAULTDEFAULT
Especifica el valor suministrado para la columna cuando no se ha especificado explícitamente un valor durante una inserción.Specifies the value provided for the column when a value is not explicitly supplied during an insert. Las definiciones DEFAULT se pueden aplicar a cualquier columna excepto a las definidas como timestamp o a aquellas que tengan la propiedad IDENTITY.DEFAULT definitions can be applied to any columns except those defined as timestamp or those with the IDENTITY property. Las definiciones DEFAULT desaparecen cuando se quita la tabla.DEFAULT definitions are removed when the table is dropped. Solo se puede utilizar un valor constante como valor predeterminado, por ejemplo, una cadena de caracteres, una función del sistema como SYSTEM_USER() o el valor 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. Para mantener la compatibilidad con las versiones anteriores de SQL ServerSQL Server, se puede asignar un nombre de restricción a DEFAULT.To maintain compatibility with earlier versions of SQL ServerSQL Server, a constraint name can be assigned to a DEFAULT.

constant_expressionconstant_expression
Es una constante, el valor NULL o una función del sistema que se utiliza como el valor predeterminado de una columna.Is a constant, NULL, or a system function used as the default value for the column.

IDENTITYIDENTITY
Indica que la nueva columna es una columna de identidad.Indicates that the new column is an identity column. Cuando se agrega una nueva fila a la tabla, SQL ServerSQL Server proporciona un valor incremental único para la columna.When a new row is added to the table, SQL ServerSQL Server provides a unique incremental value for the column. Las columnas de identidad se utilizan normalmente junto con restricciones PRIMARY KEY para que actúen como identificador exclusivo de fila para la tabla.Identity columns are commonly used in conjunction with PRIMARY KEY constraints to serve as the unique row identifier for the table. La propiedad IDENTITY se puede asignar a columnas 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. Solo se puede crear una columna de identidad para cada tabla.Only one identity column can be created per table. Las restricciones DEFAULT y los valores predeterminados enlazados no se pueden utilizar en las columnas de identidad.Bound defaults and DEFAULT constraints cannot be used with an identity column. Se debe especificar los dos argumentos, seed e increment, o ninguno.You must specify both the seed and increment, or neither. Si no se especifica ninguno, el valor predeterminado es (1,1).If neither is specified, the default is (1,1).

seedseed
Es el valor que se utiliza para la primera fila cargada en la tabla.Is the value used for the very first row loaded into the table.

incrementincrement
Es el valor incremental que se agrega al valor de identidad de la fila cargada anteriormente.Is the incremental value added to the identity value of the previous row that was loaded.

ROWGUIDCOLROWGUIDCOL
Indica que la nueva columna es una columna de identificador único global de fila.Indicates that the new column is a row global unique identifier column. Solo se puede designar una columna uniqueidentifier por tabla como columna ROWGUIDCOL.Only one uniqueidentifier column per table can be designated as the ROWGUIDCOL column. La propiedad ROWGUIDCOL únicamente se puede asignar a una columna uniqueidentifier.The ROWGUIDCOL property can be assigned only to a uniqueidentifier column.

NULL | NOT NULLNULL | NOT NULL
Indica si NULL se permite en la variable.Indicates if null is allowed in the variable. El valor predeterminado es NULL.The default is NULL.

PRIMARY KEYPRIMARY KEY
Es una restricción que exige la integridad de entidad para una o varias columnas dadas a través de un índice único.Is a constraint that enforces entity integrity for a given column or columns through a unique index. Solo se puede crear una restricción PRIMARY KEY para cada tabla.Only one PRIMARY KEY constraint can be created per table.

UNIQUEUNIQUE
Es una restricción que proporciona la integridad de entidad para una o varias columnas dadas a través de un índice único.Is a constraint that provides entity integrity for a given column or columns through a unique index. Las tablas pueden tener varias restricciones UNIQUE.A table can have multiple UNIQUE constraints.

CHECKCHECK
Es una restricción que exige la integridad del dominio al limitar los valores posibles que se pueden escribir en una o varias columnas.Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns.

logical_expressionlogical_expression
Es una expresión lógica que devuelve TRUE o FALSE.Is a logical expression that returns TRUE or FALSE.

NotasRemarks

Las variables se suelen utilizar en un proceso por lotes o procedimiento como contadores para WHILE, LOOP o un bloque IF…ELSE.Variables are often used in a batch or procedure as counters for WHILE, LOOP, or for an IF...ELSE block.

Las variables solo se pueden usar en expresiones y no en lugar de nombres de objeto o palabras clave.Variables can be used only in expressions, not in place of object names or keywords. Para formar instrucciones SQL dinámicas, utilice EXECUTE.To construct dynamic SQL statements, use EXECUTE.

El alcance de una variable local es el lote en el que está declarada.The scope of a local variable is the batch in which it is declared.

Una variable de tabla no tiene que estar residente en memoria necesariamente.A table variable is not necessarily memory resident. En condiciones de presión de memoria, las páginas que pertenecen a una variable de tabla pueden enviarse a tempdb.Under memory pressure, the pages belonging to a table variable can be pushed out to tempdb.

Se puede hacer referencia como origen a una variable de cursor que actualmente tiene asignado un cursor en una instrucción:A cursor variable that currently has a cursor assigned to it can be referenced as a source in a:

  • CLOSE.CLOSE statement.

  • DEALLOCATE.DEALLOCATE statement.

  • FETCH.FETCH statement.

  • OPEN.OPEN statement.

  • DELETE o UPDATE por posición.Positioned DELETE or UPDATE statement.

  • SET CURSOR variable (en el lado derecho).SET CURSOR variable statement (on the right side).

En todas estas instrucciones, SQL ServerSQL Server genera un error si la variable de cursor a la que se hace referencia existe pero actualmente no tiene asignado un cursor.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. Si una variable de cursor a la que se hace referencia no existe, SQL ServerSQL Server genera el mismo error que genera para una variable no declarada de otro 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 variable de cursor:A cursor variable:

  • Puede ser el destino de un tipo de cursor u otra variable de cursor.Can be the target of either a cursor type or another cursor variable. Para más información, vea SET @local_variable (Transact-SQL).For more information, see SET @local_variable (Transact-SQL).

  • Se puede hacer referencia a la variable de cursor como el destino de un parámetro de cursor de salida en una instrucción EXECUTE si la variable de cursor no tiene actualmente un cursor asignado.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.

  • Se debe considerar como un puntero al cursor.Should be regarded as a pointer to the cursor.

EjemplosExamples

A.A. Usar DECLAREUsing DECLARE

En el ejemplo siguiente se utiliza una variable local denominada @find para recuperar información de contacto para todos los apellidos que comienzan por 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;  
  

El conjunto de resultados es el siguiente.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. Usar DECLARE con dos variablesUsing DECLARE with two variables

El ejemplo siguiente recupera los nombres de representantes de ventas de Adventure Works CyclesAdventure Works Cycles que se encuentran en la zona de ventas de Norteamérica y tienen, como mínimo, $2.000.000 en ventas anuales.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. Declarar una variable de tipo tableDeclaring a variable of type table

El ejemplo siguiente crea una variable table que almacena los valores especificados en la cláusula OUTPUT de la instrucción UPDATE.The following example creates a table variable that stores the values specified in the OUTPUT clause of the UPDATE statement. Las dos instrucciones SELECT que le siguen devuelven los valores en @MyTableVar y los resultados de la operación de actualización en la tabla Employee.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. Tenga en cuenta que los resultados de la columna INSERTED.ModifiedDate son diferentes de los valores de la columna ModifiedDate de la tabla Employee.Note that the results in the INSERTED.ModifiedDate column differ from the values in the ModifiedDate column in the Employee table. Esto se debe a que el desencadenador AFTER UPDATE, que actualiza el valor de ModifiedDate a la fecha actual, se define en la tabla Employee.This is because the AFTER UPDATE trigger, which updates the value of ModifiedDate to the current date, is defined on the Employee table. Sin embargo, las columnas que devuelve OUTPUT reflejan los datos anteriores a la activación de los desencadenadores.However, the columns returned from OUTPUT reflect the data before triggers are fired. Para más información, vea Cláusula 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. Declarar una variable de tipo de tabla definido por el usuarioDeclaring a variable of user-defined table type

El ejemplo siguiente crea un parámetro con valores de tabla o una variable de tabla denominada @LocationTVP.The following example creates a table-valued parameter or table variable called @LocationTVP. Esto requiere un tipo de tabla definido por el usuario correspondiente denominado LocationTableType.This requires a corresponding user-defined table type called LocationTableType. Para más información sobre cómo crear un tipo de tabla definido por el usuario, vea CREATE TYPE (Transact-SQL).For more information about how to create a user-defined table type, see CREATE TYPE (Transact-SQL). Para más información sobre los parámetros con valores de tabla, veaUsar parámetros con valores de tabla (motor de base de datos).For more information about table-valued parameters, see Use Table-Valued Parameters (Database Engine).

DECLARE @LocationTVP   
AS LocationTableType;  

Ejemplos: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

E.E. Usar DECLAREUsing DECLARE

En el ejemplo siguiente se utiliza una variable local denominada @find para recuperar información de contacto para todos los apellidos que comienzan por 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. Usar DECLARE con dos variablesUsing DECLARE with two variables

En el siguiente ejemplo se recuperan variables de usuario para especificar el nombre y el apellido de los empleados de la tabla 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;  

Consulte tambiénSee Also

EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
Funciones integradas (Transact-SQL) Built-in Functions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
table (Transact-SQL) table (Transact-SQL)
Comparar XML con tipo y XML sin tipoCompare Typed XML to Untyped XML