セレクト @local_variable (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

ローカル変数を式の値に設定します。

変数を割り当てるには、SELECT @local_variableの代わりにSET @local_variableを使用します。

Transact-SQL 構文表記規則

Syntax

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

Arguments

@local_variable

値を割り当てる宣言された変数。

{ = | += | -= | *= | /= | %= | &= | ^= | |= }

右側の値を左側の変数に代入します。

複合代入演算子です。

Operator Action
= 後続の式を変数に代入します。
+= 加算して代入
-= 減算して代入
*= 乗算して代入
/= 除算して代入
%= 剰余を代入
&= ビットごとの AND と割り当て
^= ビットごとの XOR と割り当て
|= ビットごとの OR と割り当て

expression

任意の有効な。 この用語には、スカラー サブクエリが含まれます。

Remarks

SELECT @local_variableを使用して、変数に 1 つの値を返します。 ただし、expression が列名の場合は、複数の値を返すことができます。 SELECT ステートメントが複数の値を返す場合、変数はクエリが返す最後の値を取得します。

SELECT ステートメントが行を返さない場合、変数は現在の値を保持します。 が値を返さないスカラー サブクエリの場合、変数はNULLに設定されます。

1 つの SELECT ステートメントで複数のローカル変数を初期化できます。

Note

変数の代入を含む SELECT ステートメントを使用して、一般的な結果セットの取得操作も実行することはできません。

Examples

この記事のコード サンプルでは、AdventureWorks2025 または AdventureWorksDW2025 サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。

AdventureWorksLT データベースは、Azure SQL データベース 用のサンプル データベースとして使用されます。

A. SELECT @local_variable を使用して値を 1 つ返す

次の例では、変数@var1'Generic Name'値を取得します。 Store に指定した値は CustomerID テーブル内に存在しないため、このテーブルに対するクエリは行を返しません。 変数は "Generic Name" 値を保持します。

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 の初期値に設定できます。 この動作は、割り当てが処理される順序と頻度が決定できないために発生します。 この規則は、次の例に示すように、変数文字列連結を含む式に適用されますが、文字列以外の変数または += スタイル演算子を持つ式にも適用されます。 行ごとの操作ではなくセットベースの操作に対して代わりに集計関数を使用します。

文字列連結の場合、順序付けられた文字列連結が必要なシナリオでは、SQL Server 2017 (14.x) で導入された STRING_AGG 関数を検討してください。 詳細については、「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