SELECT @local_variable (Transact-SQL)
Se aplica a: SQL ServerAzure SQL Database Azure SQL Instancia administrada punto de conexión de SQL Analytics de Azure Synapse Analytics en Microsoft Fabric Warehouse en Microsoft Fabric SQL Database 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 puede 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
- DECLARE @local_variable (Transact-SQL)
- Expresiones (Transact-SQL)
- Operadores compuestos (Transact-SQL)
- SELECT (Transact-SQL)