SELECT @local_variable (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL Azure Synapse Analytics в хранилище Microsoft Fabric в Microsoft Fabric SQL база данных в Microsoft Fabric
Присваивает локальную переменную значению выражения.
Для присваивания переменных рекомендуется использовать инструкцию SET SET @local_variable вместо SELECT @local_variable.
Соглашения о синтаксисе Transact-SQL
Синтаксис
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ ,...n ] [ ; ]
Аргументы
@local_variable
Объявленная переменная, которой должно быть присвоено значение.
{ } =
| +=
| -=
| *=
| /=
| %=
| &=
| ^=
| |=
Присвоить значение справа переменной слева.
Составной оператор присваивания:
Оператор | Действие |
---|---|
= | Присваивает следующее за ним выражение переменной. |
+= | Сложение и присваивание |
-= | Вычитание и присваивание |
*= | Умножение и присваивание |
/= | Деление и присваивание |
%= | Остаток от деления и присваивание |
&= | Выполнение побитовой операции AND и присваивание |
^= | Выполнение побитовой операции XOR и присваивание |
|= | Выполнение побитовой операции OR и присваивание |
выражение
Любое допустимое выражение. В их число также входит скалярный вложенный запрос.
Замечания
SELECT @local_variable обычно используется для возвращения одиночного значения в переменную. Однако, если аргумент expression является именем столбца, может вернуться несколько значений. Если инструкция SELECT возвращает более одного значения, переменной присваивается последнее возвращенное значение.
Если инструкция SELECT не возвращает ни одной строки, переменная сохраняет свое текущее значение. Если аргумент expression является скалярным вложенным запросом, который не возвращает значений, переменная принимает значение NULL.
Одна инструкция SELECT может инициализировать несколько локальных переменных.
Примечание.
Инструкция SELECT, содержащая назначение переменной, не может быть использована для выполнения операций по получению типичного результирующего набора.
Примеры
А. Используйте инструкцию 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
В. Антишаблоны рекурсивного назначения переменных
Избегайте следующего шаблона рекурсивного использования переменных и выражений:
SELECT @Var = <expression containing @Var>
FROM
...
В этом случае обновление @Var
строка за строкой не гарантируется. Например, для @Var
может быть задано начальное значение @Var
во всех строках. Такое происходит потому, что порядок и частота обработки назначений являются недетерминированными. Это относится к выражениям, содержащим объединение строк переменных, как показано ниже, а также к выражениям с нестроковыми переменными или операторами в стиле +=. Вместо построчных операций используйте для наборов данных функции агрегирования.
Для объединения строк вместо этого рассмотрим STRING_AGG
функцию, представленную в SQL Server 2017 (14.x), для сценариев, в которых требуется упорядоченное объединение строк. Дополнительные сведения см. в статье STRING_AGG (Transact-SQL).
Примеры кода 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;
Результирующий набор:
(No column name)
---
Walker
Вместо этого попробуйте:
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;
Результирующий набор:
(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
См. также
- DECLARE @local_variable (Transact-SQL)
- Выражения (Transact-SQL)
- Составные операторы (Transact-SQL)
- SELECT (Transact-SQL)