Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Endpoint de analítica SQL en Microsoft Fabric
Almacén en Microsoft Fabric
Base de datos SQL en Microsoft Fabric
Establece una variable local en el valor de una expresión.
Para asignar variables, use SET @local_variable en lugar de SELECT @local_variable.
Convenciones de sintaxis de Transact-SQL
Syntax
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ , ...n ] [ ; ]
Arguments
@local_variable
Variable declarada para la que se asigna un valor.
{ = | += | -= | *= | /= | %= | &= | ^= | |=}
Asigna el valor de la derecha a la variable de la izquierda.
Operador de asignación compuesta:
| Operator | Action |
|---|---|
| = | Asigna a la variable la expresión que le sigue. |
| += | Sumar y asignar |
| -= | Restar y asignar |
| *= | Multiplicar y asignar |
| /= | Dividir y asignar |
| %= | Módulo y asignar |
| &= | A bit AND y asignar |
| ^= | A bit XOR y asignar |
| |= | A bit OR y asignar |
expression
Cualquier expression válida. Este término incluye una subconsulta escalar.
Remarks
Use SELECT @local_variable para devolver un valor único a la variable . En cambio, cuando expression es el nombre de una columna, puede devolver varios valores. Si la SELECT instrucción devuelve más de un valor, la variable obtiene el último valor que devuelve la consulta.
Si la SELECT instrucción no devuelve ninguna fila, la variable mantiene su valor actual. Si expression es una subconsulta escalar que no devuelve ningún valor, la variable se establece en NULL.
Una SELECT instrucción puede inicializar varias variables locales.
Note
No se puede usar una SELECT instrucción que contenga una asignación de variables para realizar también operaciones típicas de recuperación del conjunto de resultados.
Examples
Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.
La base de datos AdventureWorksLT se usa como base de datos de ejemplo de Azure SQL Database.
A. Usar SELECT @local_variable para devolver un solo valor
En el ejemplo siguiente, la variable @var1 obtiene el valor 'Generic Name'. La consulta realizada en la tabla Store no devuelve filas debido a que el valor especificado en CustomerID no existe en la tabla. La variable mantiene el valor "Nombre genérico".
DECLARE @var1 AS VARCHAR (30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000;
SELECT @var1 AS 'ProductName';
Este es el conjunto de resultados.
ProductName
------------------------------
Generic Name
B. Usar SELECT @local_variable para devolver NULL
En el ejemplo siguiente, una subconsulta asigna un valor a @var1. Debido a que el valor solicitado para CustomerID no existe, la subconsulta no devuelve ningún valor y la variable se establece en NULL.
DECLARE @var1 AS VARCHAR (30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = (SELECT [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000);
SELECT @var1 AS 'Company Name';
Este es el conjunto de resultados.
Company Name
----------------------------
NULL
C. Usar un antipatrón de la asignación de variables recursivas
Evite el patrón siguiente para el uso recursivo de variables y expresiones:
SELECT @Var = <expression containing @Var>
FROM
...
En este caso, no se garantiza que @Var se actualice por fila por fila. Por ejemplo, @Var puede establecerse en el valor inicial de @Var para todas las filas. Este comportamiento se produce porque el orden y la frecuencia en que se procesan las asignaciones no es determinante. Esta regla se aplica a las expresiones que contienen la concatenación de cadenas de variables, como se muestra en el ejemplo siguiente, pero también a expresiones con operadores de estilo o += variables que no son de cadena. Use funciones de agregación en su lugar para una operación basada en conjunto en vez de una operación fila por fila.
Para la concatenación de cadenas, considere la función STRING_AGG, introducida en SQL Server 2017 (14.x), en escenarios en los que se desea la concatenación de cadenas ordenadas. Para obtener más información, consulte STRING_AGG.
En el ejemplo siguiente se muestra un antipatrón que se va a evitar. El uso ORDER BY de en un intento de concatenación hace que la lista esté incompleta:
DECLARE @List AS NVARCHAR (MAX);
SELECT @List = CONCAT(COALESCE (@List + ', ', ''), p.LastName)
FROM Person.Person AS p
WHERE p.FirstName = 'William'
ORDER BY p.BusinessEntityID;
SELECT @List;
Este es el conjunto de resultados.
(No column name)
---
Walker
En su lugar, considere:
DECLARE @List AS NVARCHAR (MAX);
SELECT @List = STRING_AGG(p.LastName, ', ') WITHIN GROUP (ORDER BY p.BusinessEntityID)
FROM Person.Person AS p
WHERE p.FirstName = 'William';
SELECT @List;
Este es el conjunto de resultados.
(No column name)
---
Vong, Conner, Hapke, Monroe, Richter, Sotelo, Vong, Ngoh, White, Harris, Martin, Thompson, Martinez, Robinson, Clark, Rodriguez, Smith, Johnson, Williams, Jones, Brown, Davis, Miller, Moore, Taylor, Anderson, Thomas, Lewis, Lee, Walker