SELECT @local_variable(Transact-SQL)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스
지역 변수를 식의 값으로 설정합니다.
변수 할당에는 SELECT @local_variable 대신 SET @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 Database에 대한 샘플 데이터베이스로 사용됩니다.
-- 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 Database에 대한 샘플 데이터베이스로 사용됩니다.
-- 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 예시 및 커뮤니티 프로젝트(Microsoft SQL Server Samples and Community Projects) 홈 페이지에서 다운로드할 수 있습니다.
피해야 할 예로는 연결 순서를 지정하려고 할 때 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