Variáveis (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse no Microsoft Fabric

Uma variável local Transact-SQL é um objeto que pode conter um único valor de dados de um tipo específico. As variáveis em lotes e scripts são normalmente usadas:

  • Como um contador para contar o número de vezes que um loop é executado ou para controlar quantas vezes o loop é executado.
  • Para reter um valor de dados a ser testado por uma instrução de controle de fluxo.
  • Para salvar um valor de dados a ser retornado por um código de retorno de procedimento armazenado ou valor de retorno de função.

Comentários

Os nomes de algumas funções do sistema Transact-SQL começam com dois sinais de arroba (@@). Embora em versões anteriores do SQL Server, as @@ funções sejam chamadas de variáveis globais, @@ as funções não são variáveis e não têm os mesmos comportamentos que as variáveis. As @@ funções são funções do sistema e seu uso de sintaxe segue as regras para funções.

Você não pode usar variáveis em uma exibição.

As alterações nas variáveis não são afetadas pela reversão de uma transação.

Declarar uma variável Transact-SQL

A DECLARE instrução inicializa uma variável Transact-SQL por:

  • Atribuição de um nome. O nome deve ter uma única @ como o primeiro caractere.

  • Atribuição de um tipo de dados fornecido por sistema ou definido pelo usuário e um comprimento. Para variáveis numéricas, precisão e escala também são atribuídas. Para variáveis do tipo XML, uma coleção de esquemas opcional pode ser atribuída.

  • Definir o valor como NULL.

Por exemplo, a instrução a seguir DECLARE cria uma variável local chamada @mycounter com um tipo de dados int . Por padrão, o valor dessa variável é NULL.

DECLARE @MyCounter INT;

Para declarar mais de uma variável local, use uma vírgula depois da primeira variável local definida, e especifique o próximo nome de variável local e o tipo de dados.

Por exemplo, a instrução a seguir DECLARE cria três variáveis locais chamadas @LastName, @FirstName e @StateProvince, e inicializa cada uma delas como NULL:

DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince NCHAR(2);

Em outro exemplo, a instrução a seguir DECLARE cria uma variável booleana chamada @IsActive, que é declarada como bit com um valor de 0 (false):

DECLARE @IsActive BIT = 0;

Escopo variável

O escopo de uma variável é a gama de instruções Transact-SQL que podem referenciar a variável. O escopo de uma variável dura desde o ponto em que ela é declarada até o final do lote ou procedimento armazenado no qual ela é declarada. Por exemplo, o script a seguir gera um erro de sintaxe porque a variável é declarada em um lote (separada pela palavra-chave) e referenciada GO em outro:

USE AdventureWorks2022;
GO

DECLARE @MyVariable INT;

SET @MyVariable = 1;
GO

SELECT BusinessEntityID,
    NationalIDNumber,
    JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @MyVariable;

As variáveis têm escopo local e só são visíveis no lote ou procedimento em que são definidas. No exemplo a seguir, o escopo aninhado criado para execução de não tem acesso à variável declarada sp_executesql no escopo mais alto e retorna e error.

DECLARE @MyVariable INT;
SET @MyVariable = 1;
EXECUTE sp_executesql N'SELECT @MyVariable'; -- this produces an error

Definir um valor em uma variável Transact-SQL

Quando uma variável é declarada pela primeira vez, seu valor é definido como NULL. Para atribuir um valor a uma variável, use a SET instrução. Este é o método preferido de atribuir um valor a uma variável. Uma variável também pode ter um valor atribuído ao ser referenciada na lista de seleção de uma SELECT instrução.

Para atribuir um valor a uma variável usando a instrução SET, inclua o nome da variável e o valor a ser atribuído à variável. Este é o método preferido de atribuir um valor a uma variável. O seguinte lote, por exemplo, declara duas variáveis, atribui valores a elas e usa-as na cláusula WHERE de uma instrução SELECT:

USE AdventureWorks2022;
GO

-- Declare two variables.
DECLARE @FirstNameVariable NVARCHAR(50),
    @PostalCodeVariable NVARCHAR(15);

-- Set their values.
SET @FirstNameVariable = N'Amy';
SET @PostalCodeVariable = N'BA5 3HX';

-- Use them in the WHERE clause of a SELECT statement.
SELECT LastName,
    FirstName,
    JobTitle,
    City,
    StateProvinceName,
    CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
    OR PostalCode = @PostalCodeVariable;
GO

Uma variável também pode ter um valor atribuído ao ser referenciada na lista selecionada. Se uma variável for referenciada em uma lista de seleção, ela deverá receber um valor escalar ou a SELECT instrução deverá retornar apenas uma linha. Por exemplo:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

SELECT @EmpIDVariable = MAX(EmployeeID)
FROM HumanResources.Employee;
GO

Aviso

Se houver várias cláusulas de atribuição em uma única SELECT instrução, o SQL Server não garantirá a ordem de avaliação das expressões. Os efeitos só são visíveis se houver referências entre as atribuições.

Se uma SELECT instrução retornar mais de uma linha e a variável fizer referência a uma expressão não escalar, a variável será definida como o valor retornado para a expressão na última linha do conjunto de resultados. Por exemplo, no lote @EmpIDVariable a seguir é definido como o BusinessEntityID valor da última linha retornada, que é 1:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

SELECT @EmpIDVariable = BusinessEntityID
FROM HumanResources.Employee
ORDER BY BusinessEntityID DESC;

SELECT @EmpIDVariable;
GO

Exemplos

O script seguinte cria uma tabela de teste pequena e a popula com 26 linhas. O script usa uma variável para fazer três coisas:

  • Controlar quantas linhas são inseridas ao controlar quantas vezes o loop é executado.
  • Fornecer o valor inserido na coluna de números inteiros.
  • Funcionar como parte da expressão que gera letras a serem inseridas na coluna de caracteres.
-- Create the table.
CREATE TABLE TestTable (cola INT, colb CHAR(3));
GO

SET NOCOUNT ON;
GO

-- Declare the variable to be used.
DECLARE @MyCounter INT;

-- Initialize the variable.
SET @MyCounter = 0;

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
BEGIN;
    -- Insert a row into the table.
    INSERT INTO TestTable
    VALUES
        -- Use the variable to provide the integer value
        -- for cola. Also use it to generate a unique letter
        -- for each row. Use the ASCII function to get the
        -- integer value of 'a'. Add @MyCounter. Use CHAR to
        -- convert the sum back to the character @MyCounter
        -- characters after 'a'.
        (
        @MyCounter,
        CHAR((@MyCounter + ASCII('a')))
        );

    -- Increment the variable to count this iteration
    -- of the loop.
    SET @MyCounter = @MyCounter + 1;
END;
GO

SET NOCOUNT OFF;
GO

-- View the data.
SELECT cola, colb FROM TestTable;
GO

DROP TABLE TestTable;
GO