Partilhar via


SELECIONAR @local_variable (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure 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, recomendamos que você 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 um valor deve ser atribuído.

= | += | -= | *= | /= | %= | &= | ^= | |={ }
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
&= Bitwise E e atribuir
^= XOR bit a bit e atribuir
|= Bitwise OU e atribuir

expression

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

Remarks

SELECT @local_variable normalmente é usado 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 instrução SELECT retornar mais de um valor, a variável receberá o último valor retornado.

Se a instrução SELECT não retornar linhas, a variável manterá seu valor presente. 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.

Note

Uma instrução SELECT que contém uma atribuição variável não pode ser usada para também executar operações típicas de recuperação de conjunto de resultados.

Examples

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

No exemplo a seguir, a variável @var1 é atribuída "Generic Name" como seu valor. 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".

Este exemplo usa o AdventureWorksLT banco de dados de exemplo, para obter mais informações, consulte Bancos de dados de exemplo AdventureWorks. O AdventureWorksLT banco de dados é usado como o banco de dados de exemplo para o 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';

Aqui está o conjunto de resultados.

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

B. Use SELECT @local_variable para retornar null

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 nenhum valor e a variável é definida como NULL.

Este exemplo usa o AdventureWorksLT banco de dados de exemplo, para obter mais informações, consulte Bancos de dados de exemplo AdventureWorks. O AdventureWorksLT banco de dados é usado como o banco de dados de exemplo para o 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';

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 seria atualizado linha a linha. Por exemplo, @Var pode ser definido como 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 determinantes. Isso se aplica a expressões que contêm concatenação de cadeia de variáveis, como demonstrado abaixo, mas também a expressões com variáveis que não sejam de cadeia de caracteres 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 concatenação de cadeia de caracteres, considere a função, introduzida no SQL Server 2017 (14.x), para cenários em que a STRING_AGG concatenação ordenada de cadeia de caracteres é desejada. Para obter mais informações, consulte STRING_AGG (Transact-SQL).

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.

Um exemplo a evitar, em que o uso de ORDER BY na 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;

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

Consulte também

Próximos passos