SET @local_variable(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric
Warehouse에 있는 SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Platform System(PDW)
SQL 분석 엔드포인트
문을 사용하여 이전에 만든 지정된 지역 변수를 DECLARE @local_variable
지정된 값으로 설정합니다.
구문
SQL Server, Azure SQL Database 및 Azure SQL Managed Instance용 구문:
SET
{ @local_variable
[ . { property_name | field_name } ] = { expression | udt_name { . | :: } method_name }
}
| { @SQLCLR_local_variable.mutator_method }
| { @local_variable
{ += | -= | *= | /= | %= | &= | ^= | |= } expression
}
| { @cursor_variable =
{ @cursor_variable | cursor_name
| { CURSOR [ [ LOCAL | GLOBAL ] ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ , ...n ] ] } ]
}
}
}
Azure Synapse Analytics 및 병렬 데이터 웨어하우스 및 Microsoft Fabric에 대한 구문:
SET @local_variable { = | += | -= | *= | /= | %= | &= | ^= | |= } expression
참고 항목
SQL Server 2014(12.x) 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.
인수
@local_variable
cursor, text, ntext, image 또는 table을 제외한 모든 형식의 변수 이름입니다. 변수 이름은 기호( @
)로 시작해야 합니다. 변수 이름은 식별자에 적용되는 규칙을 따라야 합니다.
property_name
사용자 정의 형식의 속성입니다.
field_name
사용자 정의 형식의 공용 필드입니다.
udt_name
CLR(공용 언어 런타임) 사용자 정의 형식의 이름입니다.
{ . | :: }
CLR 사용자 정의 형식의 메서드를 지정합니다. 인스턴스(비정적) 메서드의 경우 마침표(.
)를 사용합니다. 정적 메서드의 경우 두 개의 콜론(::
)을 사용합니다. CLR 사용자 정의 형식의 메서드, 속성 또는 필드를 호출하려면 해당 형식에 대해 EXECUTE 권한이 있어야 합니다.
method_name ( 인수 [ ,... n ] )
하나 이상의 인수를 사용하여 한 형식의 인스턴스 상태를 수정하는 사용자 정의 형식 메서드입니다. 정적 메서드는 공용이어야 합니다.
@SQLCLR_local_variable
어셈블리에 형식이 있는 변수입니다. 자세한 내용은 CLR(공용 언어 런타임) 통합 프로그래밍 개념을 참조 하세요.
mutator_method
개체 상태를 변경할 수 있는 어셈블리의 메서드입니다. SQLMethodAttribute.IsMutator가 이 메서드에 적용됩니다.
{ += | -= | *= | /= | %= | &= | ^= | |= }
복합 할당 연산자:
+=
- 추가 및 할당-=
- 빼기 및 할당*=
- 곱하기 및 할당/=
- 나누기 및 할당%=
- 모듈로 및 할당&=
- 비트 및AND
할당^=
- 비트 및XOR
할당|=
- 비트 및OR
할당
expression
유효한 식입니다.
cursor_variable
커서 변수의 이름입니다. 대상 커서 변수가 이전에 다른 커서를 참조한 경우 이전 참조가 제거됩니다.
cursor_name
문을 사용하여 선언된 커서의 DECLARE CURSOR
이름입니다.
CURSOR
문에 SET
커서 선언이 포함되도록 지정합니다.
SCROLL
커서가 모든 페치 옵션FIRST
(, , LAST
, RELATIVE
NEXT
PRIOR
및 ABSOLUTE
)을 지원하게 지정합니다. 또한 지정할 때는 지정할 SCROLL
FAST_FORWARD
수 없습니다.
FORWARD_ONLY
커서가 옵션만 FETCH NEXT
지원되도록 지정합니다. 첫 번째 행에서 마지막 행까지 커서를 한 방향으로만 검색합니다. 키 DYNAMIC
KEYSET
워드 없이 STATIC
지정 FORWARD_ONLY
하면 커서가 .로 DYNAMIC
구현됩니다. 키워드STATIC
KEYSET
DYNAMIC
를 FORWARD_ONLY
SCROLL
지정하지 않는 한 기본값으로 지정 FORWARD_ONLY
하지 않거나 지정하지 않는 경우 . STATIC
, KEYSET
및 DYNAMIC
커서 SCROLL
의 경우 기본값입니다.
STATIC
커서에서 사용할 데이터를 임시로 복사해 주는 커서를 정의합니다. 커서에 대한 모든 요청은 다음의 임시 테이블에서 tempdb
응답됩니다. 따라서 기본 테이블에 대한 수정 내용은 해당 커서에 대한 페치에서 반환된 데이터에는 반영되지 않습니다. 또한 이 커서는 수정을 허용하지 않습니다.
KEYSET
커서가 열릴 때 커서에 있는 행의 멤버 자격과 순서가 고정되도록 지정합니다. 행을 고유하게 식별하는 키 집합은 키 집합 tempdb
에 기본 제공됩니다. 커서 소유자나 다른 사용자가 기본 테이블에서 키가 아닌 값을 변경하면 그 내용이 커서 소유자가 커서를 스크롤할 때 표시됩니다. 그러나 다른 사용자가 삽입한 데이터는 표시되지 않으며 Transact-SQL 서버 커서를 통해 데이터를 삽입할 수 없습니다.
행이 삭제되면 행을 가져오려는 시도가 다음을 @@FETCH_STATUS
-2
반환합니다. 커서 외부에서 키 값을 업데이트하는 것은 이전 행을 삭제하고 새 행을 삽입하는 것과 비슷합니다. 새 값이 있는 행이 표시되지 않으며 이전 값 @@FETCH_STATUS
-2
이 반환된 행을 가져오려고 합니다. 절을 지정하여 커서를 통해 업데이트가 수행되면 새 값이 WHERE CURRENT OF
표시됩니다.
DYNAMIC
커서 소유자가 커서를 스크롤할 때 결과 집합의 행에 모든 데이터 변경 내용이 반영되도록 커서를 정의합니다. 따라서 인출할 때마다 행의 데이터 값, 순서 및 멤버 자격이 변경될 수 있습니다. 동적 커서에는 절대 페치 및 상대 페치 옵션을 사용할 수 없습니다.
FAST_FORWARD
최적화를 FORWARD_ONLY
사용하도록 설정된 커서 READ_ONLY
를 지정합니다. FAST_FORWARD
은 지정될 때 SCROLL
지정할 수 없습니다.
READ_ONLY
이 커서를 통해 업데이트할 수 없습니다. 또는 문의 절에서 UPDATE
DELETE
커서를 WHERE CURRENT OF
참조할 수 없습니다. 이 옵션은 업데이트할 커서의 기본 기능을 무시합니다.
SCROLL LOCKS
커서를 통해 현재 위치 업데이트 또는 삭제가 반드시 실행되도록 지정합니다. SQL Server는 커서로 읽은 행을 읽을 때 해당 행을 잠가 나중에 수정할 수 있도록 합니다. 지정되는 시기 FAST_FORWARD
도 지정할 SCROLL_LOCKS
수 없습니다.
OPTIMISTIC
커서로 읽고 있는 행이 업데이트된 경우 커서를 통해 지정된 위치에서 업데이트 또는 삭제가 실패하도록 지정합니다. SQL Server는 커서로 행을 읽을 때 행을 잠그지 않습니다. 대신 timestamp 열 값을 비교하거나 테이블에 timestamp 열이 없을 경우 체크섬 값을 비교하여 커서로 읽은 후에 행이 수정되었는지 확인합니다. 행이 수정된 경우 지정된 위치에서 업데이트나 삭제가 실행되지 않습니다. 지정되는 시기 FAST_FORWARD
도 지정할 OPTIMISTIC
수 없습니다.
TYPE_WARNING
요청한 커서 형식이 다른 형식으로 암시적으로 변환된 경우 클라이언트에게 경고 메시지를 보내도록 지정합니다.
FOR select_statement
커서의 결과 집합을 정의하는 표준 SELECT
문입니다. 키워드FOR BROWSE
이며 INTO
커서 선언의 select_statement 내에서 허용되지 않습니다.
를 UNION
사용하거나 select_list 집계 식을 포함하는 경우 커서는 다음과 같이 STATIC
만들어집니다.HAVING
DISTINCT
GROUP BY
각 기본 테이블에 고유 인덱스 및 ISO SCROLL
커서가 없거나 Transact-SQL KEYSET
커서가 요청되면 커서가 자동으로 커서가 STATIC
됩니다.
select_statement 열이 고유한 행 식별자가 DYNAMIC
아닌 절을 포함하는 ORDER BY
경우 커서를 커서로 변환하거나 STATIC
커서를 열 수 없는 경우 KEYSET
커서로 변환 KEYSET
됩니다. 이 프로세스는 ISO 구문을 사용하지만 키워드 없이 정의된 커서에 STATIC
대해서도 발생합니다.
READ ONLY
이 커서를 통해 업데이트할 수 없습니다. 또는 문의 절에서 UPDATE
DELETE
커서를 WHERE CURRENT OF
참조할 수 없습니다. 이 옵션은 업데이트할 커서의 기본 기능을 무시합니다. 이 키워드는 이전 READ_ONLY
키워드와 밑줄 사이에 READ
ONLY
밑줄 대신 공백을 두어 다릅니다.
UPDATE [ of column_name [ ,... n ] ]
커서 내에서 업데이트할 수 있는 열을 정의합니다. OF <column_name> [ , ...n ]
이 제공된 경우 나열된 열만 수정이 가능합니다. 목록이 제공되지 않으면 커서가 .로 READ_ONLY
정의되지 않는 한 모든 열을 업데이트할 수 있습니다.
설명
변수가 선언되면 .로 초기화됩니다 NULL
. SET
문을 사용하여 선언된 변수에 없는 NULL
값을 할당합니다. 변수에 값을 할당하는 문은 SET
단일 값을 반환합니다. 여러 변수를 초기화하는 경우 각 지역 변수에 대해 별도의 SET
문을 사용합니다.
변수는 식에서만 사용할 수 있으며 개체 이름이나 키워드 대신 사용할 수 없습니다. 동적 Transact-SQL 문을 생성하려면 .를 사용합니다 EXECUTE
.
구문 규칙 및 키워드를 SET @cursor_variable
포함 LOCAL
하지만 구문을 사용하면 SET @cursor_variable = CURSOR...
기본값을 로컬 커서 데이터베이스 옵션으로 GLOBAL
설정에 따라 커서가 생성됩니다LOCAL
.GLOBAL
전역 커서를 참조하는 경우에도 커서 변수는 항상 지역 변수입니다. 커서 변수가 전역 커서를 참조하면 전역 커서 참조 및 로컬 커서 참조를 모두 가지게 됩니다. 자세한 내용은 예제 D를 참조 하세요. 전역 커서와 함께 SET를 사용합니다.
자세한 내용은 DECLARE CURSOR(Transact-SQL)를 참조하세요.
변수를 포함하여 연산자의 오른쪽에 식이 있는 할당이 있는 모든 위치에서 복합 할당 연산자를 사용할 수 있습니다 SET
SELECT
UPDATE
RECEIVE
.
문에 변수를 SELECT
사용하여 값을 연결하지 마세요(즉, 집계 값을 계산하기 위해). 목록의 모든 식(할당 포함)이 각 출력 행에 SELECT
대해 정확히 한 번만 실행되는 것은 아니므로 예기치 않은 쿼리 결과가 발생할 수 있습니다. 자세한 내용은 KB 287515 참조하세요.
사용 권한
public 역할의 멤버 자격이 필요합니다. 모든 사용자는 .를 사용할 SET @local_variable
수 있습니다.
예제
이 문서의 Transact-SQL 코드 샘플은 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있는 데이터베이스 또는 AdventureWorksDW2022
샘플 데이터베이스를 사용합니다AdventureWorks2022
.
A. SET를 사용하여 초기화된 변수의 값 인쇄
다음 예제에서는 @myVar
변수를 만들고, 문자열 값을 변수에 넣고, @myVar
변수 값을 출력합니다.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT @myVar;
GO
B. SELECT 문에서 SET을 사용하여 값이 할당된 지역 변수 사용
다음 예제에서는 명명된 @state
지역 변수를 만들고 문에서 SELECT
지역 변수를 사용하여 상태에 Oregon
있는 모든 직원의 이름(FirstName
) 및 패밀리 이름(LastName
)을 찾습니다.
USE AdventureWorks2022;
GO
DECLARE @state CHAR(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;
GO
C. 지역 변수에 복합 할당 사용
다음 두 예는 동일한 결과를 생성합니다. 각 예제에서는 명명 @NewBalance
된 지역 변수를 만들고 곱한 10
다음 문에 SELECT
지역 변수의 새 값을 표시합니다. 두 번째 예에서는 복합 할당 연산자를 사용합니다.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT @NewBalance;
GO
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;
GO
D. 전역 커서와 함께 SET 사용
다음 예에서는 지역 변수를 만든 후 커서 변수를 전역 커서 이름으로 설정합니다.
DECLARE my_cursor CURSOR GLOBAL
FOR SELECT * FROM Purchasing.ShipMethod
DECLARE @my_variable CURSOR ;
SET @my_variable = my_cursor ;
--There is a GLOBAL cursor declared(my_cursor) and a LOCAL variable
--(@my_variable) set to the my_cursor cursor.
DEALLOCATE my_cursor;
GO
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.
E. SET를 사용하여 커서 정의
다음 예에서는 SET
문을 사용하여 커서를 정의합니다.
DECLARE @CursorVar CURSOR;
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks2022.HumanResources.vEmployee
WHERE LastName like 'B%';
OPEN @CursorVar;
FETCH NEXT FROM @CursorVar;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @CursorVar
END;
CLOSE @CursorVar;
DEALLOCATE @CursorVar;
GO
F. 쿼리에서 값 할당
다음 예에서는 쿼리를 사용하여 변수에 값을 할당합니다.
USE AdventureWorks2022;
GO
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;
GO
G. 형식의 속성을 수정하여 사용자 정의 형식 변수에 값 할당
다음 예에서는 UDT(사용자 정의 형식) Point
의 X
속성 값을 수정하여 이 형식의 값을 설정합니다.
DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO
사용자 정의 형식 만들기 문서에서 이 예 및 다음 예에서 참조하는 Point
UDT를 만드는 방법에 대해 자세히 알아보세요.
H. 형식의 메서드를 호출하여 사용자 정의 형식 변수에 값 할당
다음 예제에서는 형식의 SetXY
메서드를 호출하여 point 사용자 정의 형식의 값을 설정합니다.
DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);
9\. CLR 형식에 대한 변수 만들기 및 변경자 메서드 호출
다음 예에서는 유형 Point
에 대한 변수를 만들고 Point
에서 변경자(mutator) 메서드를 실행합니다.
CREATE ASSEMBLY mytest FROM 'c:\test.dll' WITH PERMISSION_SET = SAFE
CREATE TYPE Point EXTERNAL NAME mytest.Point
GO
DECLARE @p Point = CONVERT(Point, '')
SET @p.SetXY(22, 23);
예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)
이 문서의 Transact-SQL 코드 샘플은 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있는 데이터베이스 또는 AdventureWorksDW2022
샘플 데이터베이스를 사용합니다AdventureWorks2022
.
J. SET를 사용하여 초기화된 변수의 값 인쇄
다음 예제에서는 @myVar
변수를 만들고, 문자열 값을 변수에 넣고, @myVar
변수 값을 출력합니다.
DECLARE @myVar CHAR(20);
SET @myVar = 'This is a test';
SELECT TOP 1 @myVar FROM sys.databases;
11. SELECT 문에서 SET을 사용하여 값이 할당된 지역 변수 사용
다음 예제에서는 이름이 지정된 @dept
지역 변수를 만들고 문에서 이 지역 변수를 사용하여 부서에서 SELECT
일하는 모든 직원의 이름(FirstName
) 및 가족 이름(LastName
)을 Marketing
찾습니다.
DECLARE @dept CHAR(25);
SET @dept = N'Marketing';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name
FROM DimEmployee
WHERE DepartmentName = @dept;
12. 지역 변수에 복합 할당 사용
다음 두 예는 동일한 결과를 생성합니다. @NewBalance
라고 하는 지역 변수를 만들고 여기에 10
을 곱한 다음 이 지역 변수의 새 값을 SELECT
문으로 표시합니다. 두 번째 예에서는 복합 할당 연산자를 사용합니다.
/* Example one */
DECLARE @NewBalance INT;
SET @NewBalance = 10;
SET @NewBalance = @NewBalance * 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
/* Example Two */
DECLARE @NewBalance INT = 10;
SET @NewBalance *= 10;
SELECT TOP 1 @NewBalance
FROM sys.tables;
13. 쿼리에서 값 할당
다음 예에서는 쿼리를 사용하여 변수에 값을 할당합니다.
-- Uses AdventureWorks
DECLARE @rows INT;
SET @rows = (SELECT COUNT(*) FROM dbo.DimCustomer);
SELECT TOP 1 @rows FROM sys.tables;