Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Относится к:SQL Server
База данных SQL Azure
Управляемый экземпляр SQL Azure
Azure Synapse Analytics
SQL analytics endpoint в Microsoft Fabric
Warehouse в Microsoft Fabric
SQL база данных в 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