Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
База данных Azure SQL
Управляемый экземпляр Azure SQL
Azure 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;