Partilhar via


Variáveis (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL 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 manter um valor de dados a ser testado por uma instrução control-of-flow.
  • 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.

Remarks

Os nomes de algumas Transact-SQL funções do sistema começam com dois sinais (@@). Embora em versões anteriores do SQL Server, as @@ funções são referidas como 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.

Não é possível usar variáveis em um modo de 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:

  • Atribuir um nome. O nome deve ter um único @ como primeiro caractere.

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

  • Definindo o valor como NULL.

Por exemplo, a instrução a seguir DECLARE cria uma variável local nomeada @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 após a primeira variável local definida e especifique o próximo nome da 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 para 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;

Âmbito das variáveis

O escopo de uma variável é o intervalo de Transact-SQL instruções que podem fazer referência à variável. O escopo de uma variável dura desde o ponto em que é declarada até o final do lote ou procedimento armazenado em que é declarada. Por exemplo, o script a seguir gera um erro de sintaxe porque a variável é declarada em um lote (separada pela palavra-chave GO ) e referenciada 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 dentro do lote ou procedimento onde 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 superior e retorna e erro.

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 lote a seguir, por exemplo, declara duas variáveis, atribui valores a elas e as usa na WHERE cláusula de uma SELECT instrução:

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 em uma lista de seleção. 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

Warning

Se houver várias cláusulas de atribuição em uma única SELECT instrução, o SQL Server não garante 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

Examples

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

  • Controle quantas linhas são inseridas controlando quantas vezes o loop é executado.
  • Forneça o valor inserido na coluna inteira.
  • Função 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