Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada de SQL do Azure
Azure Synapse Analytics
SQL analytics endpoint no Microsoft Fabric
Warehouse no Microsoft Fabric
Banco de dados SQL no Microsoft Fabric
Define uma variável local com o valor de uma expressão.
Para atribuir variáveis, use SET @local_variable em vez de SELECT @local_variable.
Convenções de sintaxe de Transact-SQL
Syntax
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ , ...n ] [ ; ]
Arguments
@local_variable
Uma variável declarada para a qual você atribui um valor.
=
|
+=
|
-=
|
*=
|
/=
|
%=
|
&=
|
^=
|
|={ }
Atribui o valor à direita à variável da esquerda.
Operador de atribuição composto:
| Operator | Action |
|---|---|
| = | Atribui a expressão a seguir à variável. |
| += | Adicionar e atribuir |
| -= | Subtrair e atribuir |
| *= | Multiplicar e atribuir |
| /= | Dividir e atribuir |
| %= | Módulo e atribuir |
| &= | Bit a bit AND e atribuir |
| ^= | Bit a bit XOR e atribuir |
| |= | Bit a bit OR e atribuir |
expression
Qualquer expression válida. Este termo inclui uma subconsulta escalar.
Remarks
Use SELECT @local_variable para retornar um único valor para a variável. No entanto, quando expression é o nome de uma coluna, ela pode retornar vários valores. Se a SELECT instrução retornar mais de um valor, a variável obterá o último valor retornado pela consulta.
Se a SELECT instrução não retornar linhas, a variável manterá seu valor atual. Se a expressão for uma subconsulta escalar que não retorna nenhum valor, a variável será definida como NULL.
Uma SELECT instrução pode inicializar várias variáveis locais.
Note
Você não pode usar uma SELECT instrução que contenha uma atribuição de variável para também executar operações típicas de recuperação do conjunto de resultados.
Examples
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.
O banco de dados AdventureWorksLT é usado como o banco de dados do Banco de Dados SQL do Azure.
A. Usar SELECT @local_variable para retornar um único valor
No exemplo a seguir, a variável @var1 obtém o 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 mantém o valor "Nome Genérico".
DECLARE @var1 AS VARCHAR (30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000;
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 atribui 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.
DECLARE @var1 AS VARCHAR (30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = (SELECT [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000);
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 é garantido que @Var seja atualizado em uma linha por linha. Por exemplo, @Var pode ser definido como o valor inicial de @Var todas as linhas. Esse comportamento ocorre porque a ordem e a frequência em que as atribuições são processadas não são determinantes. Essa regra se aplica a expressões que contêm concatenação de cadeia de caracteres de variáveis, conforme demonstrado no exemplo a seguir, mas também a expressões com variáveis não 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), para cenários em que a concatenação de cadeia de caracteres ordenada é desejada. Para obter mais informações, consulte STRING_AGG.
O exemplo a seguir mostra um antipadrão a ser evitado. Usar ORDER BY em uma tentativa de 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;
Veja a seguir o 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;
Veja a seguir o 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