Compartilhar via


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

Próximas etapas