SELECT @local_variable (Transact-SQL)

Относится к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsSQL analytics endpoint в Microsoft FabricWarehouse в Microsoft FabricSQL база данных в Microsoft Fabric

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

Для назначения переменных используйте 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 Если инструкция не возвращает строк, переменная сохраняет текущее значение. Если выражение является скалярным вложенным запросом, который не возвращает значения, переменная имеет значение NULL.

Одна SELECT инструкция может инициализировать несколько локальных переменных.

Note

Инструкцию SELECT , содержащую назначение переменной, нельзя использовать для выполнения типичных операций извлечения результирующих наборов.

Examples

Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.

База AdventureWorksLT данных используется в качестве образца базы данных для База данных SQL Azure.

A. Используйте инструкцию SELECT @local_variable для возвращения одиночного значения

В следующем примере переменная @var1 получает значение 'Generic Name'. Запрос к таблице Store не возвращает строки, потому что в ней отсутствует значение, указанное для CustomerID. Переменная сохраняет значение "Универсальное имя".

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

SELECT @var1 = [Name]
FROM SalesLT.Product
WHERE ProductID = 1000000;

SELECT @var1 AS 'ProductName';

Вот результирующий набор.

ProductName
------------------------------
Generic Name

B. Используйте инструкцию SELECT @local_variable для возвращения значения NULL

В следующем примере вложенный запрос назначает значение @var1. Так как запрошенное для CustomerID значение не существует, вложенный запрос не возвращает значение и переменная принимает значение NULL.

DECLARE @var1 AS VARCHAR (30);

SELECT @var1 = 'Generic Name';

SELECT @var1 = (SELECT [Name]
                FROM SalesLT.Product
                WHERE ProductID = 1000000);

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.

В следующем примере показан антипаттерн, чтобы избежать. Использование 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