SET @local_variable(Transact-SQL)

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

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

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 [ 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 ] ] } ] 
      } 
    }
} 

인수

  • @local_variable
    cursor, text, ntext, image 또는 table을 제외한 모든 유형의 변수 이름입니다. 변수 이름은 @ 기호로 시작해야 합니다. 변수 이름은 식별자 규칙을 따라야 합니다.

  • property_name
    사용자 정의 형식의 속성입니다.

  • field_name
    사용자 정의 형식의 공용 필드입니다.

  • udt_name
    CLR(공용 언어 런타임) 사용자 정의 형식의 이름입니다.

  • { . | :: }
    CLR 사용자 정의 형식의 메서드를 지정합니다. 비정적 인스턴스 메서드의 경우 마침표(.)를 사용합니다. 정적 메서드의 경우 콜론 두 개(::)를 사용합니다. CLR 사용자 정의 형식의 메서드, 속성 또는 필드를 호출하려면 해당 형식에 대해 EXECUTE 권한이 있어야 합니다.

  • method_name ( argument [ ,... n ] )
    하나 이상의 인수를 사용하여 한 유형의 인스턴스 상태를 수정하는 사용자 정의 형식 메서드입니다. 정적 메서드는 공용이어야 합니다.

  • @SQLCLR_local_variable
    어셈블리에 유형이 있는 변수입니다. 자세한 내용은 CLR(공용 언어 런타임) 통합 프로그래밍 개요를 참조하십시오.

  • mutator_method
    개체 상태를 변경할 수 있는 어셈블리의 메서드입니다. SQLMethodAttribute.IsMutator가 이 메서드에 적용됩니다.

  • { += | -= | *= | /= | %= | &= | ^= | |= }
    복합 할당 연산자:

    += 더하기 및 할당

    -= 빼기 및 할당

    *= 곱하기 및 할당

    /= 나누기 및 할당

    %= 모듈로 및 할당

    &= 비트 AND 및 할당

    ^= 비트 XOR 및 할당

    |= 비트 OR 및 할당

  • expression
    유효한 입니다.

  • cursor_variable
    커서 변수의 이름입니다. 대상 커서 변수가 이전에 다른 커서를 참조한 경우 이전 참조가 제거됩니다.

  • cursor_name
    DECLARE CURSOR 문을 사용하여 선언한 커서 이름입니다.

  • CURSOR
    SET 문에 커서 선언이 포함되도록 지정합니다.

  • SCROLL
    커서가 인출 옵션 FIRST, LAST, NEXT, PRIOR, RELATIVE 및 ABSOLUTE를 모두 지원하도록 지정합니다. FAST_FORWARD도 지정된 경우에는 SCROLL을 지정할 수 없습니다.

  • FORWARD_ONLY
    커서가 FETCH NEXT 옵션만 지원하도록 지정합니다. 첫 번째 행에서 마지막 행까지 커서를 한 방향으로만 검색할 수 있습니다. STATIC, KEYSET 또는 DYNAMIC 키워드를 사용하지 않고 FORWARD_ONLY를 지정하면 커서가 DYNAMIC 커서로 구현됩니다. STATIC, KEYSET 또는 DYNAMIC 키워드가 지정된 경우를 제외하면 FORWARD_ONLY나 SCROLL을 모두 지정하지 않을 경우 FORWARD_ONLY가 기본값입니다. STATIC, KEYSET 및 DYNAMIC 커서의 경우 SCROLL이 기본값입니다.

    [!참고]

    SQL Server 2000에서 FAST_FORWARD 및 FORWARD_ONLY 커서 옵션은 함께 사용할 수 없습니다. 한 옵션을 지정하면 다른 옵션을 지정할 수 없으며 오류가 발생합니다. 두 키워드를 동일한 DECLARE CURSOR 문에서 사용할 수 있습니다.

  • STATIC
    커서에서 사용할 데이터를 임시로 복사해 주는 커서를 정의합니다. 커서에 대한 모든 요청은 tempdb의 임시 테이블에서 응답합니다. 따라서 기본 테이블에서 수정된 내용이 이 커서에 대한 인출에서 반환된 데이터에 반영되지 않아 이 커서를 수정할 수 없습니다.

  • KEYSET
    커서가 열릴 때 커서에 있는 행의 멤버 자격과 순서가 고정되도록 지정합니다. 행을 고유하게 식별하는 키 집합이 tempdb의 keyset테이블에 작성됩니다. 커서 소유자나 다른 사용자가 기본 테이블에서 키가 아닌 값을 변경하면 그 내용이 커서 소유자가 커서를 스크롤할 때 표시됩니다. 그러나 다른 사용자가 삽입한 데이터는 표시되지 않으며 Transact-SQL 서버 커서를 통해 데이터를 삽입할 수 없습니다.

    삭제된 행을 인출하려고 하면 @@FETCH_STATUS가 -2로 반환됩니다. 커서 외부에서 키 값을 업데이트하는 것은 이전 행을 삭제하고 새 행을 삽입하는 것과 비슷합니다. 새 값을 가진 행을 볼 수 없으므로 이전 값을 가진 행을 인출하려고 하면 @@FETCH_STATUS가 -2로 반환됩니다. WHERE CURRENT OF 절을 지정하여 커서를 통해 업데이트를 수행한 경우에는 새 값을 볼 수 있습니다.

  • DYNAMIC
    커서 소유자가 커서를 스크롤할 때 결과 집합의 행에 모든 데이터 변경 내용이 반영되도록 커서를 정의합니다. 따라서 인출할 때마다 행의 데이터 값, 순서 및 멤버 자격이 변경될 수 있습니다. 동적 커서에는 절대 인출 및 상대 인출 옵션을 사용할 수 없습니다.

  • FAST_FORWARD
    성능 최적화가 설정된 FORWARD_ONLY, READ_ONLY 커서를 지정합니다. SCROLL도 지정된 경우에는 FAST_FORWARD를 지정할 수 없습니다.

    [!참고]

    SQL Server 2000에서 FAST_FORWARD 및 FORWARD_ONLY 커서 옵션은 함께 사용할 수 없습니다. 한 옵션을 지정하면 다른 옵션을 지정할 수 없으며 오류가 발생합니다. 두 키워드를 동일한 DECLARE CURSOR 문에서 사용할 수 있습니다.

  • 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 문입니다. 커서 선언의 select_statement 내에서 COMPUTE, COMPUTE BY, FOR BROWSE 및 INTO 키워드는 사용할 수 없습니다.

    DISTINCT, UNION, GROUP BY 또는 HAVING을 사용하거나 select_list에 집계 식이 포함되면 커서가 STATIC으로 생성됩니다.

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

    select_statement 문에 열이 고유 행 식별자가 아닌 ORDER BY 절이 들어 있으면 DYNAMIC 커서가 KEYSET 커서로 변환되며 KEYSET 커서를 열 수 없는 경우에는 STATIC 커서로 변환됩니다. STATIC 키워드를 사용하지 않고 ISO 구문을 사용해 정의한 커서의 경우도 마찬가지입니다.

  • 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 및 GLOBAL 키워드가 없습니다. SET @cursor_variable = CURSOR... 구문을 사용하면 로컬 커서를 기본값으로 데이터베이스 옵션의 설정에 따라 커서가 GLOBAL 또는 LOCAL로 생성됩니다.

전역 커서를 참조하는 경우에도 커서 변수는 항상 지역 변수입니다. 커서 변수가 전역 커서를 참조하면 전역 커서 참조 및 로컬 커서 참조를 모두 가지게 됩니다. 자세한 내용은 예 3을 참조하십시오.

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

할당 연산자의 오른쪽에 변수가 포함된 식이 있고 UPDATE, SELECT 및 RECEIVE 문에 SET이 포함된 곳에는 어디에나 복합 할당 연산자를 사용할 수 있습니다.

사용 권한

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

1. SET를 사용하여 초기화된 변수 값 인쇄

다음 예에서는 @myvar 변수를 만들고 문자열 값을 변수로 지정한 다음 @myvar 변수 값을 인쇄합니다.

DECLARE @myvar char(20);
SET @myvar = 'This is a test';
SELECT @myvar;
GO

2. SELECT 문에서 SET를 사용하여 값이 할당된 지역 변수 사용

다음 예에서는 @state라는 지역 변수를 만들고 이 변수를 SELECT 문에 사용하여 Oregon 주에 사는 모든 직원의 이름과 성을 찾습니다.

USE AdventureWorks2008R2;
GO
DECLARE @state char(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;

3. 지역 변수에 복합 할당 사용

다음 두 예는 동일한 결과를 생성합니다. @NewBalance라고 하는 지역 변수를 만들고 여기에 10을 곱한 다음 이 지역 변수의 새 값을 SELECT 문으로 표시합니다. 두 번째 예에서는 복합 할당 연산자를 사용합니다.

/* Example one */
DECLARE  @NewBalance  int ;
SET  @NewBalance  =  10;
SET  @NewBalance  =  @NewBalance  *  10;
SELECT  @NewBalance;

/* Example Two */
DECLARE @NewBalance int = 10;
SET @NewBalance *= 10;
SELECT @NewBalance;

4. 전역 커서와 함께 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; 
--There is now only a LOCAL variable reference
--(@my_variable) to the my_cursor cursor.

5. SET을 사용하여 커서 정의

다음 예에서는 SET 문을 사용하여 커서를 정의합니다.

DECLARE @CursorVar CURSOR;

SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM AdventureWorks2008R2.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;

6. 쿼리에서 값 할당

다음 예에서는 쿼리를 사용하여 변수에 값을 할당합니다.

USE AdventureWorks2008R2;
GO
DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM Sales.Customer);
SELECT @rows;

7. 사용자 정의 형식의 속성을 수정하여 사용자 정의 형식 변수에 값 할당

다음 예에서는 사용자 정의 형식의 X 속성 값을 수정하여 사용자 정의 형식 Point의 값을 설정합니다.

DECLARE @p Point;
SET @p.X = @p.X + 1.1;
SELECT @p;
GO

8. 사용자 정의 형식의 메서드를 호출하여 사용자 정의 형식 변수에 값 할당

다음 예에서는 사용자 정의 형식 Point의 값을 같은 형식의 SetXY 메서드를 호출하여 설정합니다.

DECLARE @p Point;
SET @p=point.SetXY(23.5, 23.5);

9. CLR 유형에 대한 변수를 만들고 변경자(mutator) 메서드 호출

다음 예에서는 유형 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);