SELECT @local_variable (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsSQL analytics endpoint no Microsoft FabricWarehouse no Microsoft FabricBanco 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