SELECT @local_variable (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Ponto de extremidade de análises SQL no Microsoft Fabric Warehouse no Microsoft Fabric
Define uma variável local com o valor de uma expressão.
Para atribuir variáveis, recomendamos o uso de SET @local_variable, em vez de SELECT @local_variable.
Convenções de sintaxe de Transact-SQL
Sintaxe
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ ,...n ] [ ; ]
Argumentos
@local_variable
É uma variável declarada à qual será atribuído um valor.
{ =
| +=
| -=
| *=
| /=
| %=
| &=
| ^=
| |=
}
Atribui o valor à direita à variável da esquerda.
Operador de atribuição composto:
Operador | Ação |
---|---|
= | Atribui a expressão a seguir à variável. |
+= | Adicionar e atribuir |
-= | Subtrair e atribuir |
*= | Multiplicar e atribuir |
/= | Dividir e atribuir |
%= | Módulo e atribuir |
&= | AND bit a bit e atribuir |
^= | XOR bit a bit e atribuir |
|= | OR bit a bit e atribuir |
expressão
Qualquer expression válida. Isso inclui uma subconsulta escalar.
Comentários
SELECT @local_variable normalmente é usado para retornar um único valor na variável. No entanto, quando expression é o nome de uma coluna, ela pode retornar vários valores. Se a instrução SELECT retornar mais de um valor, à variável será atribuído o último valor retornado.
Se a instrução SELECT não retornar nenhuma linha, a variável reterá seu valor atual. Se expression for uma subconsulta escalar que não retorna nenhum valor, a variável será definida como NULL.
Uma instrução SELECT pode inicializar várias variáveis locais.
Observação
Uma instrução SELECT que contém uma atribuição de variável não pode ser usada também para executar operações típicas de recuperação de conjunto de resultados.
Exemplos
a. Usar SELECT @local_variable para retornar um único valor
No exemplo a seguir, a variável @var1
é atribuída ao valor "Generic Name". A consulta na tabela Store
não retorna linhas porque o valor especificado para CustomerID
não existe na tabela. A variável retém o valor "Generic Name".
Este exemplo usa o banco de dados de exemplo AdventureWorksLT
. Para obter mais informações, confira Bancos de dados de exemplo AdventureWorks. O banco de dados AdventureWorksLT
é usado como o banco de dados do Banco de Dados SQL do Azure.
-- 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';
Veja a seguir o conjunto de resultados.
ProductName
------------------------------
Generic Name
B. Usar SELECT @local_variable para retornar nulo
No exemplo a seguir, uma subconsulta é usada para atribuir um valor a @var1
. Como o valor solicitado para CustomerID
não existe, a subconsulta não retorna valores, e a variável é definida como NULL
.
Este exemplo usa o banco de dados de exemplo AdventureWorksLT
. Para obter mais informações, confira Bancos de dados de exemplo AdventureWorks. O banco de dados AdventureWorksLT
é usado como o banco de dados do Banco de Dados SQL do Azure.
-- 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';
Veja a seguir o conjunto de resultados.
Company Name
----------------------------
NULL
C. Uso antipadrão da atribuição de variável recursiva
Evite o seguinte padrão para uso recursivo de variáveis e expressões:
SELECT @Var = <expression containing @Var>
FROM
...
Nesse caso, não há garantia de que @Var
seria atualizada linha por linha. Por exemplo, @Var
pode ser definido como o valor inicial de @Var
para todas as linhas. Isso ocorre porque a ordem e a frequência em que as atribuições são processadas não são determinísticas. Isso se aplica a expressões que contêm concatenação de cadeias de caracteres de variáveis, conforme demonstrado abaixo, mas também expressões com variáveis que não sejam de cadeia de caracteres ou operadores de estilo + =. Use as funções de agregação para uma operação baseada em conjunto em vez de uma operação linha por linha.
Para concatenação de cadeia de caracteres, considere a função STRING_AGG
, introduzida em SQL Server 2017 (14.x), em cenários em que a concatenação de cadeia de caracteres ordenada é desejada. Para obter mais informações, confira STRING_AGG (Transact-SQL).
Os exemplos de código do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022
ou AdventureWorksDW2022
, que pode ser baixado da home page Microsoft SQL Server Samples and Community Projects.
Veja abaixo um exemplo a ser evitado, em que o uso de ORDER BY para tentar ordenar a concatenação faz com que a lista fique 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
Em vez disso, 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;
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
Confira também
- DECLARE @local_variable (Transact-SQL)
- Expressões (Transact-SQL)
- Operadores compostos (Transact-SQL)
- SELECT (Transact-SQL)