SET @local_variable(Transact-SQL)

적용 대상: Microsoft Fabric의 Microsoft FabricWarehouse에 있는 SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPlatform System(PDW) SQL 분석 엔드포인트

문을 사용하여 이전에 만든 지정된 지역 변수를 DECLARE @local_variable 지정된 값으로 설정합니다.

Transact-SQL 구문 표기 규칙

구문

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, RELATIVENEXTPRIORABSOLUTE)을 지원하게 지정합니다. 또한 지정할 때는 지정할 SCROLLFAST_FORWARD수 없습니다.

FORWARD_ONLY

커서가 옵션만 FETCH NEXT 지원되도록 지정합니다. 첫 번째 행에서 마지막 행까지 커서를 한 방향으로만 검색합니다. 또는 DYNAMIC 키워드(keyword) 없이 STATICKEYSET지정 FORWARD_ONLY 하면 커서가 다음과 같이 DYNAMIC구현됩니다. 키워드(keyword) STATICDYNAMICKEYSET지정하지 않는 한 기본값을 지정 FORWARD_ONLYFORWARD_ONLYSCROLL하지 않거나 지정하지 않으면 기본값입니다. STATIC, KEYSETDYNAMIC 커서 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

이 커서를 통해 업데이트할 수 없습니다. 또는 문의 절에서 UPDATEDELETE 커서를 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 문입니다. 키워드(keyword) FOR BROWSEINTO 커서 선언의 select_statement 내에서 허용되지 않습니다.

UNION사용하거나 select_list 집계 식을 포함하는 경우 커서는 다음과 같이 STATIC만들어집니다.HAVINGDISTINCTGROUP BY

각 기본 테이블에 고유 인덱스 및 ISO SCROLL 커서가 없거나 Transact-SQL KEYSET 커서가 요청되면 커서가 자동으로 커서가 STATIC 됩니다.

select_statement 열이 고유한 행 식별자가 DYNAMIC 아닌 절을 포함하는 ORDER BY 경우 커서를 커서로 변환하거나 STATIC 커서를 열 수 없는 경우 KEYSET 커서로 변환 KEYSET 됩니다. 이 프로세스는 키워드(KEYWORD) 없이 ISO 구문을 사용하여 정의된 커서에 STATIC 대해서도 발생합니다.

READ ONLY

이 커서를 통해 업데이트할 수 없습니다. 또는 문의 절에서 UPDATEDELETE 커서를 WHERE CURRENT OF 참조할 수 없습니다. 이 옵션은 업데이트할 커서의 기본 기능을 무시합니다. 이 키워드(keyword) 앞부분 READ_ONLY 과 밑줄 사이에 READONLY밑줄 대신 공백을 두는 것에 따라 다릅니다.

UPDATE [ of column_name [ ,... n ] ]

커서 내에서 업데이트할 수 있는 열을 정의합니다. OF <column_name> [ , ...n ]이 제공된 경우 나열된 열만 수정이 가능합니다. 목록이 제공되지 않으면 커서가 .로 READ_ONLY정의되지 않는 한 모든 열을 업데이트할 수 있습니다.

설명

변수가 선언되면 .로 초기화됩니다 NULL. SET 문을 사용하여 선언된 변수에 없는 NULL 값을 할당합니다. 변수에 값을 할당하는 문은 SET 단일 값을 반환합니다. 여러 변수를 초기화하는 경우 각 지역 변수에 대해 별도의 SET 문을 사용합니다.

변수는 식에서만 사용할 수 있으며 개체 이름이나 키워드 대신 사용할 수 없습니다. 동적 Transact-SQL 문을 생성하려면 .를 사용합니다 EXECUTE.

구문 규칙 SET @cursor_variable 과 키워드(keyword) 포함 LOCAL 하지만 구문을 사용하면 SET @cursor_variable = CURSOR... 기본값을 로컬 커서 데이터베이스 옵션으로 GLOBAL 설정에 따라 커서가 생성됩니다 LOCALGLOBAL .

전역 커서를 참조하는 경우에도 커서 변수는 항상 지역 변수입니다. 커서 변수가 전역 커서를 참조하면 전역 커서 참조 및 로컬 커서 참조를 모두 가지게 됩니다. 자세한 내용은 예제 D를 참조 하세요. 전역 커서와 함께 SET를 사용합니다.

자세한 내용은 DECLARE CURSOR(Transact-SQL)를 참조하세요.

변수를 포함하여 연산자의 오른쪽에 식이 있는 할당이 있는 모든 위치에서 복합 할당 연산자를 사용할 수 있습니다 SETSELECTUPDATERECEIVE.

문에 변수를 SELECT 사용하여 값을 연결하지 마세요(즉, 집계 값을 계산하기 위해). 목록의 모든 식(할당 포함)이 각 출력 행에 SELECT 대해 정확히 한 번만 실행되는 것은 아니므로 예기치 않은 쿼리 결과가 발생할 수 있습니다. 자세한 내용은 KB 287515 참조하세요.

사용 권한

public 역할의 멤버 자격이 필요합니다. 모든 사용자는 .를 사용할 SET @local_variable수 있습니다.

예제

이 문서에는 AdventureWorks2022 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있는 샘플 데이터베이스가 필요합니다.

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(사용자 정의 형식) PointX 속성 값을 수정하여 이 형식의 값을 설정합니다.

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)

이 문서에는 AdventureWorks2022 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있는 샘플 데이터베이스가 필요합니다.

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;