Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к: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;