SET @local_variable(Transact-SQL)

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

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

구문

SET 
{ @local_variable 
    [:: property_name | field_name ] = expression | udt_name { . | :: } method_name(argument [ ,...n ] ) 
}
| 
{ @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] )

하나 이상의 인수를 사용하여 한 유형의 인스턴스 상태를 수정하는 사용자 정의 유형 메서드입니다. 정적 메서드는 공용이어야 합니다.

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 커서 옵션은 함께 사용할 수 없습니다. 한 옵션을 지정하면 다른 옵션을 지정할 수 없으며 오류가 발생합니다. SQL Server 2005 에서는 두 키워드를 동일한 DECLARE CURSOR 문에 사용할 수 있습니다.

STATIC

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

KEYSET

커서가 열릴 때 커서에 있는 행의 멤버 자격과 순서가 고정되도록 지정합니다. 행을 고유하게 식별하는 키 집합이 tempdbkeyset 테이블에 작성됩니다. 커서 소유자나 다른 사용자가 기본 테이블에서 키가 아닌 값을 변경하면 그 내용이 커서 소유자가 커서를 스크롤할 때 표시됩니다. 그러나 다른 사용자가 삽입한 데이터는 표시되지 않으며 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 커서 옵션은 함께 사용할 수 없습니다. 한 옵션을 지정하면 다른 옵션을 지정할 수 없으며 오류가 발생합니다. SQL Server 2005 에서는 두 키워드를 동일한 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으로 생성됩니다.

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

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

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)를 참조하십시오.

사용 권한

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 AdventureWorks;
GO
DECLARE @state char(25);
SET @state = N'Oregon';
SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, City
FROM HumanResources.vEmployee
WHERE StateProvinceName = @state;

3. 전역 커서와 함께 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.

4. SET를 사용하여 커서 정의

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

DECLARE @CursorVar CURSOR;

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

5. 쿼리에서 값 할당

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

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

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

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

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

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

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

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

참고 항목

참조

DECLARE @local\_variable(Transact-SQL)
EXECUTE(Transact-SQL)
SELECT(Transact-SQL)
SET(Transact-SQL)

관련 자료

식(데이터베이스 엔진)
변수 및 매개 변수 사용(데이터베이스 엔진)

도움말 및 정보

SQL Server 2005 지원 받기