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

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Локальная переменная Transact-SQL представляет собой объект, содержащий одно значение определенного типа.A Transact-SQL local variable is an object that can hold a single data value of a specific type. Переменные обычно используются в пакетах и скриптах:Variables in batches and scripts are typically used:

  • в качестве счетчика цикла;As a counter either to count the number of times a loop is performed or to control how many times the loop is performed.
  • для хранения значения, которое необходимо проверить инструкцией управления потоком;To hold a data value to be tested by a control-of-flow statement.
  • для хранения значения, возвращенного функцией или хранимой процедурой.To save a data value to be returned by a stored procedure return code or function return value.

Примечание

Имена некоторых системных функций Transact-SQL начинаются с двух символов @ (@@).The names of some Transact-SQL system functions begin with two at signs (@@). Хотя в предыдущих версиях сервера SQL ServerSQL Server @@функции называются глобальными переменными, они не являются переменными и используются иначе.Although in earlier versions of SQL ServerSQL Server, the @@functions are referred to as global variables, they are not variables and do not have the same behaviors as variables. @@функции являются системными, и использование их синтаксиса соответствует правилам вызова функций.The @@functions are system functions, and their syntax usage follows the rules for functions.

Следующий скрипт создает небольшую тестовую таблицу из 26 строк.The following script creates a small test table and populates it with 26 rows. Переменная используется в скрипте в качестве:The script uses a variable to do three things:

  • счетчика цикла для управления количеством вставляемых строк;Control how many rows are inserted by controlling how many times the loop is executed.
  • значения, вставляемого в столбец целочисленного типа;Supply the value inserted into the integer column.
  • аргумента функции, формирующей строку, которая вставляется в столбец символьного типа:Function as part of the expression that generates letters to be inserted into the character column.
-- 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

Объявление переменных в языке Transact-SQLDeclaring a Transact-SQL Variable

Инструкция DECLARE инициализирует переменную Transact-SQL следующим образом:The DECLARE statement initializes a Transact-SQL variable by:

  • Назначение имени.Assigning a name. Первым символом имени должен быть одиночный символ @.The name must have a single @ as the first character.
  • Назначение длины и типа данных, определяемого системой или пользователем.Assigning a system-supplied or user-defined data type and a length. Для числовых переменных задаются также точность и масштаб.For numeric variables, a precision and scale are also assigned. Для переменных типа XML может быть дополнительно задана коллекция схем.For variables of type XML, an optional schema collection may be assigned.
  • Присваивает созданной переменной значение NULL.Setting the value to NULL.

Например, следующая инструкция DECLARE создает локальную переменную @mycounter типа int.For example, the following DECLARE statement creates a local variable named @mycounter with an int data type.

DECLARE @MyCounter int;

Инструкция DECLARE позволяет объявить несколько переменных одинакового или разного типов через запятую.To declare more than one local variable, use a comma after the first local variable defined, and then specify the next local variable name and data type.

Например, следующая инструкция DECLARE создает три локальные переменные с именем @LastName, @FirstName и @StateProvince, присваивая каждой из них значение NULL:For example, the following DECLARE statement creates three local variables named @LastName, @FirstName and @StateProvince, and initializes each to NULL:

DECLARE @LastName nvarchar(30), @FirstName nvarchar(20), @StateProvince nchar(2);

Областью видимости переменной называют диапазон инструкций Transact-SQL, которые могут к ней обращаться.The scope of a variable is the range of Transact-SQL statements that can reference the variable. Областью видимости переменной являются все инструкции между ее объявлением и концом пакета или хранимой процедуры, где она объявлена.The scope of a variable lasts from the point it is declared until the end of the batch or stored procedure in which it is declared. Например, следующий скрипт содержит синтаксическую ошибку, поскольку переменная объявлена в одном пакете, а используется в другом:For example, the following script generates a syntax error because the variable is declared in one batch and referenced in another:

USE AdventureWorks2014;
GO
DECLARE @MyVariable int;
SET @MyVariable = 1;
-- Terminate the batch by using the GO keyword.
GO 
-- @MyVariable has gone out of scope and no longer exists.

-- This SELECT statement generates a syntax error because it is
-- no longer legal to reference @MyVariable.
SELECT BusinessEntityID, NationalIDNumber, JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @MyVariable;

Переменные имеют локальную область видимости и доступны только внутри пакета или процедуры, где они объявлены.Variables have local scope and are only visible within the batch or procedure where they are defined. В следующем примере вложенная область видимости, созданная для выполнения процедуры sp_executesql, не имеет доступа к переменной, объявленной в более высокой области видимости, и возвращает ошибку:In the following example, the nested scope created for execution of sp_executesql does not have access to the variable declared in the higher scope and returns and error.

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

Присвоение значения переменной в языке Transact-SQLSetting a Value in a Transact-SQL Variable

При объявлении переменной присваивается значение NULL.When a variable is first declared, its value is set to NULL. Чтобы изменить значение переменной, применяется инструкция SET.To assign a value to a variable, use the SET statement. Этот способ присвоения значений переменным является предпочтительным.This is the preferred method of assigning a value to a variable. Кроме того, переменной можно присвоить значение, указав ее в списке выбора инструкции SELECT.A variable can also have a value assigned by being referenced in the select list of a SELECT statement.

Чтобы присвоить значение переменной при помощи инструкции SET, необходимо указать ее имя и присваиваемое значение.To assign a variable a value by using the SET statement, include the variable name and the value to assign to the variable. Этот способ присвоения значений переменным является предпочтительным.This is the preferred method of assigning a value to a variable. Например, следующий пакет объявляет две переменные, присваивает им значения и использует их в предложении WHERE инструкции SELECT:The following batch, for example, declares two variables, assigns values to them, and then uses them in the WHERE clause of a SELECT statement:

USE AdventureWorks2014;
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

Переменной можно присвоить значение, указав ее в списке выбора.A variable can also have a value assigned by being referenced in a select list. Если список выбора ссылается на переменную, то ей должно быть присвоено скалярное значение, или инструкция SELECT должна возвращать только одну строку.If a variable is referenced in a select list, it should be assigned a scalar value or the SELECT statement should only return one row. Пример:For example:

USE AdventureWorks2014;
GO
DECLARE @EmpIDVariable int;

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

Предупреждение

Когда при выполнении инструкции SELECT переменной присваивается несколько значений, сервер SQL Server не гарантирует порядок вычисления выражений.If there are multiple assignment clauses in a single SELECT statement, SQL Server does not guarantee the order of evaluation of the expressions. Обратите внимание, что этот эффект проявляется, только если инструкция присваивает значение переменной.Note that effects are only visible if there are references among the assignments.

Если инструкция SELECT возвращает более одной строки и переменная ссылается на нескалярное выражение, ей присваивается значение, которое возвращается для выражения в последней строке результирующего набора.If a SELECT statement returns more than one row and the variable references a non-scalar expression, the variable is set to the value returned for the expression in the last row of the result set. Например, в следующем пакете переменной @EmpIDVariable присваивается значение идентификатора BusinessEntityID последней возвращенной строки, равное 1:For example, in the following batch @EmpIDVariable is set to the BusinessEntityID value of the last row returned, which is 1:

USE AdventureWorks2014;
GO
DECLARE @EmpIDVariable int;

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

SELECT @EmpIDVariable;
GO

См. также:See Also

Declare @local_variableDeclare @local_variable
SET @local_variableSET @local_variable
SELECT @local_variableSELECT @local_variable
Выражения (Transact-SQL) Expressions (Transact-SQL)
Составные операторы (Transact-SQL)Compound Operators (Transact-SQL)