sp_cursor(Transact-SQL)

현재 위치 업데이트를 요청합니다. 이 프로시저는 커서의 인출 버퍼 내에서 하나 이상의 행에 대해 작업을 수행합니다. sp_cursor는 TDS(Tabular Data Stream) 패킷에서 ID = 1을 지정하여 호출합니다.

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

구문

sp_cursor  cursor, optype, rownum, table
    [ , value [...n] ] ]

인수

  • cursor
    커서 핸들입니다. cursor은 int 입력 값을 필요로 하는 필수 매개 변수입니다. cursor는 SQL Server에서 생성하며 sp_cursoropen 프로시저에서 반환하는 핸들 값입니다.

  • optype
    커서가 수행할 작업을 지정하는 필수 매개 변수입니다. optype은 다음 int 입력 값 중 하나를 필요로 합니다.

    이름

    설명

    0X0001

    UPDATE

    인출 버퍼에서 하나 이상의 행을 업데이트하는 데 사용됩니다. rownum에 지정된 행에 다시 액세스하여 해당 행을 업데이트합니다.

    0x0002

    DELETE

    인출 버퍼에서 하나 이상의 행을 삭제하는 데 사용됩니다. rownum에 지정된 행에 다시 액세스하여 해당 행을 삭제합니다.

    0X0004

    INSERT

    SQL INSERT 문을 작성하지 않고 데이터를 삽입합니다.

    0X0008

    REFRESH

    기본 테이블로 버퍼를 다시 채우는 데 사용되며, 낙관적 동시성 제어로 인해 업데이트나 삭제가 실패하는 경우 또는 UPDATE 후에 행을 새로 고치는 데 사용할 수 있습니다.

    0X10

    LOCK

    지정된 행이 포함된 페이지에서 SQL Server U 잠금이 적용되도록 합니다. 이 잠금은 S 잠금과는 호환되지만 X 잠금 또는 기타 U 잠금과는 호환되지 않습니다. 단기 잠금을 구현하는 데 사용할 수 있습니다.

    0X20

    SETPOSITION

    프로그램이 후속 SQL Server 위치 지정 DELETE 또는 UPDATE 문을 실행할 예정인 경우에만 사용됩니다.

    0X40

    ABSOLUTE

    UPDATE 또는 DELETE와 함께 사용해야 합니다. ABSOLUTE는 KEYSET 커서와 함께 사용해야 하며, DYNAMIC 커서의 경우에는 무시되고 STATIC 커서는 업데이트할 수 없습니다.

    [!참고]

    인출되지 않은 키 집합의 행에 대해 ABSOLUTE를 지정하면 작업에서 동시성 검사가 실패할 수 있으며 반환 결과를 보장할 수 없습니다.

  • rownum
    커서가 작업을 수행하거나 업데이트 또는 삭제할 인출 버퍼의 행을 지정합니다.

    [!참고]

    이 작업은 RELATIVE, NEXT 또는 PREVIOUS 인출 작업의 시작 지점이나 sp_cursor를 사용하여 수행하는 업데이트 또는 삭제에는 영향을 주지 않습니다.

    rownum은 int 입력 값을 필요로 하는 필수 매개 변수입니다.

    • 1
      인출 버퍼의 첫 번째 행을 나타냅니다.

    • 2
      인출 버퍼의 두 번째 행을 나타냅니다.

    • 3, 4, 5
      세 번째 행 등 번호 순서대로 해당 행을 나타냅니다.

    • n
      인출 버퍼의 n번째 행을 나타냅니다.

    • 0
      인출 버퍼의 모든 행을 나타냅니다.

      [!참고]

      UPDATE, DELETE, REFRESH 또는 LOCK optype 값에만 사용할 수 있습니다.

  • table
    커서 정의에 조인이 포함되거나 value 매개 변수가 보호한 열 이름을 반환하는 경우 optype 이 적용되는 테이블을 식별하는 테이블 이름입니다. 특정 테이블을 지정하지 않으면 FROM 열의 첫 테이블이 기본적으로 사용됩니다. table 은 String 입력 값을 필요로 하는 선택적 매개 변수입니다. 문자열은 원하는 문자나 UNICODE 데이터 형식으로 지정할 수 있습니다. table은 여러 부분으로 구성된 테이블 이름일 수 있습니다.

  • value
    값을 삽입하거나 업데이트하는 데 사용됩니다. value 문자열 매개 변수는 UPDATE 및 INSERT optype 값에만 사용됩니다. 문자열은 원하는 문자나 UNICODE 데이터 형식으로 지정할 수 있습니다.

    [!참고]

    value의 매개 변수 이름은 사용자가 할당할 수 있습니다.

반환 코드 값

RPC를 사용할 때는 버퍼 번호가 0인 위치 지정 DELETE 또는 UPDATE 작업이 인출 버퍼의 모든 행에 대해 rowcount 값이 0(실패) 또는 1(성공)인 DONE 메시지를 반환합니다.

주의

optype 매개 변수

SETPOSITION을 UPDATE, DELETE, REFRESH, LOCK과 조합하는 경우 또는 ABSOLUTE를 UPDATE 또는 DELETE와 조합하는 경우를 제외하면 optype 값은 함께 사용할 수 없습니다.

UPDATE 값의 SET 절은 value 매개 변수에서 생성됩니다.

INSERT optype 값을 사용하는 경우의 이점 중 하나는 삽입을 위해 문자가 아닌 데이터를 문자 형식으로 변환하지 않아도 된다는 것입니다. 값은 UPDATE와 같은 방식으로 지정됩니다. 필수 열이 포함되어 있지 않으면 INSERT는 실패합니다.

  • SETPOSITION 값은 RELATIVE, NEXT 또는 PREVIOUS 인출 작업의 시작 지점이나 sp_cursor 인터페이스를 사용하여 수행하는 업데이트 또는 삭제에는 영향을 주지 않습니다. 인출 버퍼에서 행을 지정하지 않는 모든 숫자의 위치는 1로 설정되고 오류는 반환되지 않습니다. SETPOSITION을 실행하고 나면 같은 커서를 통해 다음 sp_cursorfetch 작업, T-SQL FETCH 작업 또는 sp_cursor SETPOSITION 작업을 수행할 때까지는 해당 위치가 적용된 상태로 유지됩니다. 후속 sp_cursorfetch 작업은 커서 위치를 새 인출 버퍼의 첫 번째 행으로 설정하는 반면, 다른 커서 호출은 위치 값에 영향을 주지 않습니다. 위치 값을 마지막으로 수정된 행으로 설정하기 위해 REFRESH, UPDATE, DELETE 또는 LOCK을 사용하여 SETPOSITION을 OR 절에 연결할 수 있습니다.

인출 버퍼의 행이 rownum 매개 변수를 통해 지정되지 않으면 위치가 1로 설정되며 오류는 반환되지 않습니다. 위치가 설정되고 나면 같은 커서에서 다음 sp_cursorfetch 작업, T-SQL FETCH 작업 또는 sp_cursor SETPOSITION 작업을 수행할 때까지는 해당 위치가 적용된 상태로 유지됩니다.

커서 위치를 마지막으로 수정된 행으로 설정하기 위해 REFRESH, UPDATE, DELETE 또는 LOCK을 사용하여 SETPOSITION을 OR 절에 연결할 수 있습니다.

rownum 매개 변수

지정하는 경우 rownum 매개 변수는 인출 버퍼 내의 행 수가 아니라 키 집합 내의 행 수로 해석할 수 있습니다. 사용자는 동시성 제어가 유지되는지를 확인해야 합니다. 즉, SCROLL_LOCKS 커서에 대해 지정된 행에서 독립적으로 잠금을 유지해야 합니다. 이는 트랜잭션을 통해 수행할 수 있습니다. OPTIMISTIC 커서의 경우에는 이 작업을 수행하려면 이전에 행을 인출했어야 합니다.

table 매개 변수

optype 값이 UPDATE 또는 INSERT이고 전체 업데이트 또는 삽입 문이 value 매개 변수로 제출된 경우 table에 대해 지정된 값이 무시됩니다.

[!참고]

뷰와 관련해서는 뷰에 참가여하는 테이블 하나만 수정할 수 있습니다. value 매개 변수 열 이름은 뷰의 열 이름을 반영해야 하지만, 테이블 이름은 기본 테이블 이름일 수 있습니다. 이 경우 sp_cursor는 뷰 이름을 바꿉니다.

value 매개 변수

앞서 인수 섹션에서 설명한 value 사용 규칙 대신 다른 두 가지 규칙을 사용할 수 있습니다.

  1. 명명된 value 매개 변수에 대해 선택 목록에서 열 이름 앞에 '@'가 붙은 이름을 사용할 수 있습니다. 이 이름을 사용하는 경우 데이터 변환이 필요하지 않을 수도 있다는 이점이 있습니다.

  2. 매개 변수 하나를 사용해 전체 UPDATE 또는 INSERT 문을 제출하거나, 여러 매개 변수를 사용해 UPDATE 또는 INSERT 문의 여러 부분을 제출할 수 있습니다. 이렇게 제출된 여러 부분은 SQL Server에서 전체 문으로 작성합니다. 이 작업의 예는 이 항목 뒷부분의 예 섹션에 나와 있습니다. 

다른 value 매개 변수 사용 방식

UPDATE의 경우:

단일 매개 변수를 사용하는 경우 다음 구문을 사용해 UPDATE 문을 제출할 수 있습니다.

[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,…n]

[!참고]

UPDATE <테이블 이름>을 지정하는 경우에는 table 매개 변수에 대해 지정된 값이 무시됩니다.

여러 매개 변수를 사용하는 경우에는 첫 번째 매개 변수가 다음 형식의 문자열이어야 합니다.

[ SET ] <column name> = expression [,... n]

그리고 후속 매개 변수는 다음 형식이어야 합니다.

<column name> = expression [,... n]

이 경우 생성된 UDPATE 문의 <테이블 이름>은 table 매개 변수가 지정했거나 기본값으로 설정한 값입니다.

INSERT의 경우:

단일 매개 변수를 사용하는 경우 다음 구문을 사용해 INSERT 문을 제출할 수 있습니다.

[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,... n] )

[!참고]

INSERT <table name>을 지정하는 경우에는 table 매개 변수에 대해 지정된 값이 무시됩니다.

여러 매개 변수를 사용하는 경우에는 첫 번째 매개 변수가 다음 형식의 문자열이어야 합니다.

[ VALUES ( ] <expression> [,... n]

그리고 후속 매개 변수는 다음 형식이어야 합니다.

expression [,... n]

단, VALUES를 지정한 경우는 예외입니다. 이 경우에는 마지막 식 다음에 후행 ")"가 있어야 합니다. 이 경우 생성된 UDPATE 문의 <table name>은 table 매개 변수가 지정했거나 기본값으로 설정한 값입니다.

[!참고]

매개 변수 하나를 명명된 매개 변수인 " @VALUES"로 제출할 수 있습니다. 이 경우 다른 명명된 매개 변수는 사용할 수 없습니다.

참고 항목

참조

sp_cursoropen(Transact-SQL)

sp_cursorfetch(Transact-SQL)

시스템 저장 프로시저(Transact-SQL)