SELECT @local_variable (Transact-SQL)

Aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint de analítica SQL en Microsoft FabricAlmacén en Microsoft FabricBase 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