Поделиться через


Переменные (Transact-SQL)

Применимо к:SQL ServerБаза данных Azure SQLУправляемый экземпляр Azure SQLAzure Synapse AnalyticsСистема платформы аналитики (PDW)Конечная точка SQL аналитики в Microsoft FabricХранилище в Microsoft FabricБаза данных SQL в Microsoft Fabric

Локальная переменная Transact-SQL представляет собой объект, содержащий одно значение определенного типа. Обычно переменные используются в пакетах и сценариях в следующих целях:

  • Используйте переменную в качестве счетчика для подсчета количества операций цикла или управления числом операций цикла.
  • Удерживайте значение данных для тестирования с помощью инструкции управления потоком.
  • Сохраните значение данных, возвращаемое хранимой процедурой, возвращаемого кодом или возвращаемым значением функции.

Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.

Remarks

Имена некоторых системных функций Transact-SQL начинаются с двух символов @ (@@). Хотя более ранние версии SQL Server относятся к @@ функциям как глобальным переменным, @@ функции не являются переменными, и они не имеют того же поведения, что и переменные. Функции @@ являются системными функциями, а их синтаксис использует правила для функций.

В представлении нельзя использовать переменные.

Откат транзакции не влияет на изменения переменных.

Объявление переменной Transact-SQL

Используйте инструкцию DECLARE для инициализации переменной Transact-SQL следующими способами:

  • Назначение имени. Имя должно начинаться с одного @ символа.

  • Назначение длины и типа данных, определяемого системой или пользователем. Для числовых переменных можно назначить точность и необязательный масштаб. Для переменных типа XML можно при необходимости назначить коллекцию схем.

  • Задание значения NULL.

Например, следующая DECLARE инструкция создает локальную переменную @mycounter с типом данных int . По умолчанию значение этой переменной равно NULL.

DECLARE @MyCounter AS INT;

Чтобы объявить несколько локальных переменных, используйте запятую после первого определения локальной переменной, а затем укажите следующее имя локальной переменной и тип данных.

Например, следующая DECLARE инструкция создает три локальных переменных с именем @LastName, @FirstNameа также @StateProvinceинициализирует каждую из них:NULL

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

В другом примере следующая DECLARE инструкция создает логическую переменную @IsActive, которая объявляется как бит с значением 0 (false):

DECLARE @IsActive AS BIT = 0;

Переменный обхват

Областью видимости переменной называют диапазон инструкций Transact-SQL, которые могут к ней обращаться. Область переменной длится с точки, объявленной до конца пакета или хранимой процедуры, в которой она объявлена. Например, следующий скрипт создает синтаксическую ошибку, так как переменная объявляется в одном пакете (разделенном GO ключевым словом) и ссылается на другое:

USE AdventureWorks2025;
GO

DECLARE @MyVariable AS INT;
SET @MyVariable = 1;

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

Переменные имеют локальную область и отображаются только в пакете или процедуре, в которой они определены. В следующем примере вложенная область, созданная для выполнения sp_executesql , не имеет доступа к переменной, объявленной в более высокой области, и возвращает ошибку.

DECLARE @MyVariable AS INT;
SET @MyVariable = 1;

EXECUTE sp_executesql N'SELECT @MyVariable';

Этот запрос выдает следующую ошибку:

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@MyVariable".

Установка значения в переменной Transact-SQL

При первом объявлении переменной его значение равно NULL. Чтобы назначить значение переменной, используйте инструкцию SET . Этот метод является предпочтительным способом назначения значения переменной. Вы также можете назначить значение переменной, ссылаясь на нее SELECT в списке выбора инструкции.

Чтобы назначить переменную значение с помощью SET инструкции, добавьте имя переменной и значение, которое необходимо назначить переменной. Этот метод является предпочтительным способом назначения значения переменной. Например, следующий пакет объявляет две переменные, присваивает им значения и использует их в предложении WHERE инструкции SELECT:

USE AdventureWorks2025;
GO

-- Declare two variables.
DECLARE @FirstNameVariable AS NVARCHAR (50),
        @PostalCodeVariable AS 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,
       PostalCode,
       StateProvinceName,
       CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
      OR PostalCode = @PostalCodeVariable;

Вы также можете назначить значение переменной, ссылаясь на нее в списке выбора. Если вы ссылаетесь на переменную в списке выбора, назначьте его скалярное значение или убедитесь, что SELECT инструкция возвращает только одну строку. Рассмотрим пример.

USE AdventureWorks2025;
GO

DECLARE @EmpIDVariable AS INT;

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

Warning

Если в одной SELECT инструкции существует несколько предложений назначения, ядро СУБД не гарантирует порядок оценки выражений. Эффекты видны только при наличии ссылок между назначениями.

Если инструкция возвращает несколько строк и переменная ссылается на нескаларовое SELECT выражение, переменная задается значением, возвращаемым для выражения в последней строке результирующий набор. Например, в следующем пакете @EmpIDVariable задано BusinessEntityID значение последней строки, возвращаемой 1:

USE AdventureWorks2025;
GO

DECLARE @EmpIDVariable AS INT;

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

SELECT @EmpIDVariable;

Examples

Следующий скрипт создает небольшую тестовую таблицу из 26 строк. Переменная используется в скрипте в качестве:

  • счетчика цикла для управления количеством вставляемых строк;
  • значения, вставляемого в столбец целочисленного типа;
  • Функция в составе выражения, создающего буквы для вставки в символьный столбец.
-- Create the table.
CREATE TABLE TestTable
(
    cola INT,
    colb CHAR (3)
);

SET NOCOUNT ON;

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

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

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
    -- Insert a row into the table.
    BEGIN
        INSERT INTO TestTable
        -- 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'.
        VALUES (
            @MyCounter,
            CHAR((@MyCounter + ASCII('a')))
        );
        -- Increment the variable to count this iteration
        -- of the loop.
        SET @MyCounter = @MyCounter + 1;
    END
SET NOCOUNT OFF;

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