Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureAzure Synapse Analytics
Конечная точка аналитики SQL в Microsoft Fabric
Хранилище в Microsoft Fabric
База данных SQL в предварительной версии Microsoft Fabric
Присваивает локальную переменную значению выражения.
Для присваивания переменных рекомендуется использовать инструкцию SET SET @local_variable вместо SELECT @local_variable.
Соглашения о синтаксисе Transact-SQL
Syntax
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ ,...n ] [ ; ]
Arguments
@ local_variable
Объявленная переменная, которой должно быть присвоено значение.
{ } =
| +=
| -=
| *=
| /=
| %=
| &=
| ^=
| |=
Присвоить значение справа переменной слева.
Составной оператор присваивания:
Operator | Action |
---|---|
= | Присваивает следующее за ним выражение переменной. |
+= | Сложение и присваивание |
-= | Вычитание и присваивание |
*= | Умножение и присваивание |
/= | Деление и присваивание |
%= | Остаток от деления и присваивание |
&= | Выполнение побитовой операции AND и присваивание |
^= | Выполнение побитовой операции XOR и присваивание |
|= | Выполнение побитовой операции OR и присваивание |
expression
Любое допустимое выражение. В их число также входит скалярный вложенный запрос.
Remarks
SELECT @local_variable обычно используется для возвращения одиночного значения в переменную. Однако, если аргумент expression является именем столбца, может вернуться несколько значений. Если инструкция SELECT возвращает более одного значения, переменной присваивается последнее возвращенное значение.
Если инструкция SELECT не возвращает ни одной строки, переменная сохраняет свое текущее значение. Если аргумент expression является скалярным вложенным запросом, который не возвращает значений, переменная принимает значение NULL.
Одна инструкция SELECT может инициализировать несколько локальных переменных.
Note
Инструкция SELECT, содержащая назначение переменной, не может быть использована для выполнения операций по получению типичного результирующего набора.
Examples
A. Используйте инструкцию SELECT @local_variable для возвращения одиночного значения
В следующем примере переменной @var1
присваивается значение "Generic Name" (Обычное имя). Запрос к таблице Store
не возвращает строки, потому что в ней отсутствует значение, указанное для CustomerID
. Переменная сохраняет значение "Generic Name".
В этом примере используется AdventureWorksLT
пример базы данных, чтобы получить дополнительные сведения, см . примеры баз данных AdventureWorks. База AdventureWorksLT
данных используется в качестве образца базы данных для База данных SQL Azure.
-- Uses AdventureWorks2022LT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000; --Value does not exist
SELECT @var1 AS 'ProductName';
Вот результирующий набор.
ProductName
------------------------------
Generic Name
B. Используйте инструкцию SELECT @local_variable для возвращения значения NULL
В следующем примере вложенный запрос используется для присвоения значения @var1
. Так как запрошенное для CustomerID
значение не существует, вложенный запрос не возвращает значение и переменная принимает значение NULL
.
В этом примере используется AdventureWorksLT
пример базы данных, чтобы получить дополнительные сведения, см . примеры баз данных AdventureWorks. База AdventureWorksLT
данных используется в качестве образца базы данных для База данных SQL Azure.
-- Uses AdventureWorksLT
DECLARE @var1 VARCHAR(30);
SELECT @var1 = 'Generic Name';
SELECT @var1 = (SELECT [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000); --Value does not exist
SELECT @var1 AS 'Company Name';
Вот результирующий набор.
Company Name
----------------------------
NULL
C. Антишаблоны рекурсивного назначения переменных
Избегайте следующего шаблона рекурсивного использования переменных и выражений:
SELECT @Var = <expression containing @Var>
FROM
...
В этом случае обновление @Var
строка за строкой не гарантируется. Например, для @Var
может быть задано начальное значение @Var
во всех строках. Такое происходит потому, что порядок и частота обработки назначений являются недетерминированными. Это относится к выражениям, содержащим объединение строк переменных, как показано ниже, а также к выражениям с нестроковыми переменными или операторами в стиле +=. Вместо построчных операций используйте для наборов данных функции агрегирования.
Для объединения строк вместо этого рассмотрим STRING_AGG
функцию, представленную в SQL Server 2017 (14.x), для сценариев, в которых требуется упорядоченное объединение строк. Дополнительные сведения см. в статье STRING_AGG (Transact-SQL).
Примеры кода в этой статье используют базу данных образца AdventureWorks2022
или AdventureWorksDW2022
, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.
В следующем примере при попытке упорядочить объединение с помощью ORDER BY список оказывается неполным. Старайтесь так не делать:
DECLARE @List AS nvarchar(max);
SELECT @List = CONCAT(COALESCE(@List + ', ',''), p.LastName)
FROM Person.Person AS p
WHERE p.FirstName = 'William'
ORDER BY p.BusinessEntityID;
SELECT @List;
Result set:
(No column name)
---
Walker
Instead, consider:
DECLARE @List AS nvarchar(max);
SELECT @List = STRING_AGG(p.LastName,', ') WITHIN GROUP (ORDER BY p.BusinessEntityID)
FROM Person.Person AS p
WHERE p.FirstName = 'William';
SELECT @List;
Result set:
(No column name)
---
Vong, Conner, Hapke, Monroe, Richter, Sotelo, Vong, Ngoh, White, Harris, Martin, Thompson, Martinez, Robinson, Clark, Rodriguez, Smith, Johnson, Williams, Jones, Brown, Davis, Miller, Moore, Taylor, Anderson, Thomas, Lewis, Lee, Walker
See also
- DECLARE @local_variable (Transact-SQL)
- Expressions (Transact-SQL)
- Составные операторы (Transact-SQL)
- SELECT (Transact-SQL)