SELECT @local_variable (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Microsoft Fabric 中的 SQL 分析端點 Microsoft Fabric 中的倉儲
將區域變數設為運算式的值。
若要指派變數,建議您使用 SET @local_variable,而不是 SELECT @local_variable。
語法
SELECT { @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression }
[ ,...n ] [ ; ]
引數
@local_variable
要對其指派值的宣告變數。
{ =
|=
^=
| | | &=
%=
| /=
| | | *=
| +=
-=
}
將右邊的值指派給左邊的變數。
複合指派運算子:
運算子 | 動作 |
---|---|
= | 將後面的運算式指派給變數。 |
+= | 加並指派 |
-= | 減並指派 |
*= | 乘並指派 |
/= | 除並指派 |
%= | 取餘數並指派 |
&= | 位元 AND 並指派 |
^= | 位元 XOR 並指派 |
|= | 位元 OR 並指派 |
expression
任何有效的運算式。 其中包括純量子查詢。
備註
SELECT @local_variable 通常用來將單一值傳回給變數。 不過,當 expression 是資料行名稱時,它可以傳回多個值。 如果 SELECT 陳述式傳回多個值,就會將最後傳回的值指派給變數。
如果 SELECT 陳述式未傳回任何資料列,變數會保留它目前的值。 如果 expression 是未傳回任何值的純量子查詢,變數會設為 NULL。
一個 SELECT 陳述式可以初始化多個本機變數。
注意
您不能也利用包含變數指派的 SELECT 陳述式來執行一般結果集擷取作業。
範例
A. 使用 SELECT @local_variable 傳回單一值
在下列範例中,對變數 @var1
指派了 "Generic Name" 作為其值。 針對 Store
資料表的查詢不會傳回任何資料列,因為資料表中並沒有指定給 CustomerID
的值。 變數會保留 "Generic Name" 值。
此範例會 AdventureWorksLT
使用範例資料庫,如需詳細資訊,請參閱 AdventureWorks 範例資料庫。 資料庫AdventureWorksLT
會作為 Azure SQL 資料庫 的範例資料庫。
-- 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
會作為 Azure SQL 資料庫 的範例資料庫。
-- 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
。 這是因為處理指派的順序和頻率不具決定性。 這適用於包含變數字串串連的運算式 (如下所示),但也適用於具有非字串變數或 += 樣式運算子的運算式。 請針對以集合為基礎的運算 (而不是逐列運算) 改用彙總函數。
針對字串串連,如果需要已排序的字串串連,請改為考慮使用 SQL Server 2017 (14.x) 中引進的 STRING_AGG
函數。 如需詳細資訊,請參閱 STRING_AGG (Transact-SQL)。
本文 Transact-SQL 程式碼範例使用 AdventureWorks2022
或 AdventureWorksDW2022
範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (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)