Compartir vía


SELECT @local_variable (Transact-SQL)

Se aplica a: SQL Server Base de datos de Azure SQL Azure SQL Managed Instance Azure Synapse Analytics Punto de conexión de análisis SQL en Microsoft Fabric Almacén en Microsoft Fabric

Establece una variable local en el valor de una expresión.

Para asignar variables, se recomienda usar SET @local_variable en lugar de SELECT @local_variable.

Convenciones de sintaxis de Transact-SQL

Sintaxis

SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
    [ ,...n ] [ ; ]

Argumentos

@local_variable

Una variable declarada a la que se va a asignar un valor.

{ = | += | -= | *= | /= | %= | &= | ^= | |= }
Asigna el valor de la derecha a la variable de la izquierda.

Operador de asignación compuesta:

Operator Acción
= 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
&= AND bit a bit y asignar
^= XOR bit a bit y asignar
|= OR bit a bit y asignar

expression

Cualquier expression válida. Esto incluye una subconsulta escalar.

Observaciones

SELECT @local_variable se suele usar para devolver un único valor a la variable. En cambio, cuando expression es el nombre de una columna, puede devolver varios valores. Si la instrucción SELECT devuelve más de un valor, se asigna a la variable el último valor devuelto.

Si la instrucción SELECT no devuelve filas, 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 instrucción SELECT puede inicializar varias variables locales.

Nota:

Una instrucción SELECT que contenga una asignación de variable no se puede utilizar para realizar operaciones típicas de obtención de conjuntos de resultados.

Ejemplos

A. Usar SELECT @local_variable para devolver un solo valor

En el ejemplo a continuación, se asigna el valor "Nombre genérico" a la variable @var1. 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 conserva el valor "Nombre genérico".

Este ejemplo usa la base de datos de muestra AdventureWorksLT. Para obtener más información, consulte Bases de datos de ejemplo AdventureWorks. La base de datos AdventureWorksLT se usa como base de datos de ejemplo de Azure SQL Database.

-- Uses AdventureWorks2022LT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';

SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000; --Value does not exist
SELECT @var1 AS 'ProductName';

Este es el conjunto de resultados.

ProductName
------------------------------
Generic Name

B. Usar SELECT @local_variable para devolver NULL

En el siguiente ejemplo, se utiliza una subconsulta para asignar 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.

Este ejemplo usa la base de datos de muestra AdventureWorksLT. Para obtener más información, consulte Bases de datos de ejemplo AdventureWorks. La base de datos AdventureWorksLT se usa como base de datos de ejemplo de Azure SQL Database.

-- Uses AdventureWorksLT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';

SELECT @var1 = (SELECT [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000); --Value does not exist

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 se actualice @Var fila por fila. Por ejemplo, @Var se puede establecer en el valor inicial de @Var para todas las filas. Se debe a que el orden y la frecuencia en los que se procesan las asignaciones no son determinantes. Se aplica a las expresiones que contienen una concatenación de cadenas de variables, como se muestra a continuación, pero también a expresiones con variables que no son de cadena u operadores del estilo +=. Use funciones de agregación en su lugar para una operación basada en conjunto en vez de una operación fila por fila.

En el caso de la concatenación de cadenas, considere en su lugar la función STRING_AGG, que ya presentamos en SQL Server 2017 (14.x), para escenarios en los que busque una concatenación de cadenas ordenada. Para obtener más información, consulte STRING_AGG (Transact-SQL).

Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022 o AdventureWorksDW2022, que se pueden descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.

Evite el uso de ORDER BY para intentar ordenar la concatenación, ya que hará 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;

Conjunto de resultados:

(No column name)
---
Walker

En su lugar, considere lo siguiente:

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;

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

Consulte también

Pasos siguientes