SELECT @local_variable(Transact-SQL)

적용 대상: SQL Server(지원되는 모든 버전) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics

지역 변수를 식의 값으로 설정합니다.

변수 할당에는 SELECT @local_variable 대신 SET @local_variable을 사용하는 것이 좋습니다.

Transact-SQL 구문 규칙

Syntax

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

참고

SQL Server 2014 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.

인수

@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” 값을 유지합니다.

이 예제에서는 AdventureWorks2019LT 샘플 데이터베이스를 사용합니다. 자세한 내용은 AdventureWorks 샘플 데이터베이스를 참조하세요. AdventureWorksLT 데이터베이스는 Azure SQL Database의 sample 데이터베이스로 사용됩니다.

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

결과 집합은 다음과 같습니다.

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

B. SELECT @local_variable을 사용하여 null 반환

다음 예에서는 @var1에 값을 할당하기 위해 하위 쿼리가 사용됩니다. CustomerID에 대해 요청한 값이 없기 때문에 하위 쿼리에서 값을 반환하지 않고 변수가 NULL로 설정됩니다.

이 예제에서는 AdventureWorks2019LT 샘플 데이터베이스를 사용합니다. 자세한 내용은 AdventureWorks 샘플 데이터베이스를 참조하세요. AdventureWorksLT 데이터베이스는 Azure SQL Database의 sample 데이터베이스로 사용됩니다.

-- 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의 초기 값으로 설정될 수 있습니다. 이렇게 되는 이유는 할당이 처리되는 순서와 빈도가 비확정적이기 때문입니다. 이 내용은 아래에 설명된 것처럼 변수 문자열 연결이 포함된 식뿐만 아니라 문자열이 아닌 변수 또는 += 스타일 연산자가 있는 식에도 적용됩니다. 집합 기반 작업에는 행별 작업 대신 집계 함수를 사용하세요.

문자열 연결의 경우 순서가 지정된 문자열 연결이 필요할 때는 SQL Server 2017(14.x)에 도입된 STRING_AGG 함수를 대신 사용하는 것이 좋습니다. 자세한 내용은 STRING_AGG(Transact-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

추가 정보

다음 단계