SELECT @local_variable (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики Synapse Analyticsв Хранилище Microsoft Fabric в Microsoft Fabric

Присваивает локальную переменную значению выражения.

Для присваивания переменных рекомендуется использовать инструкцию SET SET @local_variable вместо SELECT @local_variable.

Соглашения о синтаксисе Transact-SQL

Синтаксис

SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
    [ ,...n ] [ ; ]

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

@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

C. Антишаблоны рекурсивного назначения переменных

Избегайте следующего шаблона рекурсивного использования переменных и выражений:

SELECT @Var = <expression containing @Var>
FROM
...

В этом случае обновление @Var строка за строкой не гарантируется. Например, для @Var может быть задано начальное значение @Var во всех строках. Такое происходит потому, что порядок и частота обработки назначений являются недетерминированными. Это относится к выражениям, содержащим объединение строк переменных, как показано ниже, а также к выражениям с нестроковыми переменными или операторами в стиле +=. Вместо построчных операций используйте для наборов данных функции агрегирования.

Для объединения строк вместо этого рассмотрим STRING_AGG функцию, представленную в SQL Server 2017 (14.x), для сценариев, в которых требуется упорядоченное объединение строк. Дополнительные сведения см. в статье STRING_AGG (Transact-SQL).

В этой статье требуется AdventureWorks2022 пример базы данных, которую можно скачать на домашней странице примеров и проектов сообщества 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

См. также

Следующие шаги