SELECT @local_variable (Transact-SQL)

適用範圍: 是SQL Server (所有支援的版本) 是Azure SQL Database 是Azure SQL 受控執行個體 是Azure Synapse Analytics

將區域變數設為運算式的值。

對於指派變數,我們建議您使用 SET @local_variable,而不是 SELECT @local_variable

主題連結圖示 Transact-SQL 語法慣例

語法

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

注意

若要檢視 SQL Server 2014 與更早版本的 Transact-SQL 語法,請參閱舊版文件

引數

@local_variable

這是將指派值的宣告變數。

{= | += | -= | *= | /= | %= | &= | ^= | |= }
將右邊的值指派給左邊的變數。

複合指派運算子:

operator action
= 將後面的運算式指派給變數。
+= 加並指派
-= 減並指派
*= 乘並指派
/= 除並指派
%= 取餘數並指派
&= 位元 AND 並指派
^= 位元 XOR 並指派
|= 位元 OR 並指派

expression

這是任何有效的運算式。 其中包括純量子查詢。

備註

SELECT @local_variable 通常用來將單一值傳回給變數。 不過,當 expression 是資料行名稱時,它可以傳回多個值。 如果 SELECT 陳述式傳回多個值,就會將最後傳回的值指派給變數。

如果 SELECT 陳述式未傳回任何資料列,變數會保留它目前的值。 如果 expression 是未傳回任何值的純量子查詢,變數會設為 NULL。

一個 SELECT 陳述式可以初始化多個本機變數。

注意

您不能也利用包含變數指派的 SELECT 陳述式來執行一般結果集擷取作業。

範例

A. 使用 SELECT @local_variable 傳回單一值

在下列範例中,變數 @var1 會指派為 "Generic Name" 作為其值。 針對 Store 資料表的查詢不會傳回任何資料列,因為資料表中並沒有指定給 CustomerID 的值。 變數會保留「泛型名稱」值。

此範例會使用 AdventureWorks2019LT 範例資料庫。如需詳細資訊,請參閱 AdventureWorks 範例資料庫。 AdventureWorksLT 資料庫是用來做為的 sample 資料庫 Azure SQL Database 。

-- Uses AdventureWorks2019LT
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';  

以下為結果集。

Company Name  
------------------------------  
Generic Name  

B. 使用 SELECT @local_variable 傳回 Null

在下列範例中,利用子查詢來將值指派給 @var1。 由於針對 CustomerID 所要求的值並不存在,因此,子查詢不會傳回任何值,變數會設為 NULL

此範例會使用 AdventureWorks2019LT 範例資料庫。如需詳細資訊,請參閱 AdventureWorks 範例資料庫。 AdventureWorksLT 資料庫是用來做為的 sample 資料庫 Azure SQL Database 。

-- Uses AdventureWorks2019  
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 。 這是因為指派的處理順序和頻率 nondeterminant。 這適用于包含變數字串串連的運算式(如下所示),也適用于具有非字串變數或 + = 樣式運算子的運算式。 使用彙總函式,而不是逐資料列的作業。

針對字串串連,請考慮 STRING_AGG 在中 SQL Server 2017 (14.x) 針對需要排序的字串串連案例,考慮引入的函式。 如需詳細資訊,請參閱STRING_AGG (SQL) 。 此範例使用 AdventureWorks2016 或 AdventureWorks2019 範例資料庫。 如需詳細資訊,請參閱 AdventureWorks 範例資料庫

要避免的範例,其中使用 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

另請參閱

下一步