SELECIONAR @local_variable (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

Define uma variável local como o valor de uma expressão.

Para atribuir variáveis, use SET @local_variable em vez de SELECT @local_variable.

Transact-SQL convenções de sintaxe

Syntax

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

Arguments

@local_variable

Uma variável declarada para a qual atribui um valor.

= | += | -= | *= | /= | %= | &= | ^= | |={ }

Atribua o valor à direita à variável à esquerda.

Operador de atribuição composta:

Operator Action
= Atribui a expressão que se segue à variável.
+= Adicionar e atribuir
-= Subtrair e atribuir
*= Multiplicar e atribuir
/= Dividir e atribuir
%= Modulo e atribuir
&= bit a AND bit e assign
^= bit a XOR bit e assign
|= bit a OR bit e assign

expression

Qualquer expressão válida. Este termo inclui uma subconsulta escalar.

Remarks

Use SELECT @local_variable para devolver um único valor à variável. No entanto , quando expression é o nome de uma coluna, ela pode retornar vários valores. Se a SELECT instrução devolver mais do que um valor, a variável recebe o último valor que a consulta devolve.

Se a SELECT instrução não devolver linhas, a variável mantém o seu valor atual. Se a expressão for uma subconsulta escalar que não retorna valor, a variável é definida para NULL.

Uma SELECT instrução pode inicializar múltiplas variáveis locais.

Note

Não pode usar uma SELECT instrução que contenha uma atribuição de variável para também realizar operações típicas de recuperação de conjuntos de resultados.

Examples

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.

O AdventureWorksLT banco de dados é usado como o banco de dados de exemplo para o Banco de Dados SQL do Azure.

A. Use SELECT @local_variable para retornar um único valor

No exemplo seguinte, a variável @var1 obtém o valor 'Generic Name'. A consulta na Store tabela 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';

Aqui está o conjunto de resultados.

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

B. Use SELECT @local_variable para retornar null

No exemplo seguinte, uma subconsulta atribui um valor a @var1. Como o valor solicitado para CustomerID não existe, a subconsulta não retorna nenhum valor 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';

Aqui está o conjunto de resultados.

Company Name
----------------------------
NULL

C. Uso antipadrão de atribuição de variável recursiva

Evite o seguinte padrão para o uso recursivo de variáveis e expressões:

SELECT @Var = <expression containing @Var>
FROM
...

Neste caso, não é garantido que @Var isso seja atualizado linha a linha. Por exemplo, @Var pode ser definido como valor inicial de @Var para todas as linhas. Este comportamento ocorre porque a ordem e frequência com que as atribuições são processadas não é determinante. Esta regra aplica-se a expressões que contêm concatenação de cadeias de variáveis, como demonstrado no exemplo seguinte, mas também a expressões com variáveis não de cadeia ou += operadores de estilo. Use funções de agregação em vez disso para uma operação baseada em conjunto em vez de uma operação linha por linha.

Para a concatenação de cadeias, considere a função STRING_AGG, introduzida em SQL Server 2017 (14.x), para cenários em que se deseja a concatenação ordenada das cadeias. Para mais informações, consulte STRING_AGG.

O exemplo seguinte mostra um antipadrão a evitar. Usar ORDER BY numa 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;

Aqui está 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;

Aqui está 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