FETCH(Transact-SQL)

Transact-SQL 서버 커서에서 특정 행을 검색합니다.

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

구문

FETCH 
          [ [ NEXT | PRIOR | FIRST | LAST 
                    | ABSOLUTE { n | @nvar } 
                    | RELATIVE { n | @nvar } 
               ] 
               FROM 
          ] 
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name } 
[ INTO @variable_name [ ,...n ] ] 

인수

  • NEXT
    현재 행 바로 다음의 결과 행을 반환하며 현재 행을 반환되는 행 앞의 행으로 만듭니다. 커서에 대해 FETCH NEXT가 첫 번째 인출인 경우에는 결과 집합의 첫 번째 행을 반환합니다. NEXT는 커서 인출의 기본 옵션입니다.

  • PRIOR
    현재 행 바로 앞의 결과 행을 반환하며 현재 행을 반환되는 행 뒤의 행으로 만듭니다. 커서에 대해 FETCH PRIOR가 첫 번째 인출인 경우에는 행이 반환되지 않으며 커서는 첫 번째 행 앞에 위치하게 됩니다.

  • FIRST
    커서의 첫 번째 행을 반환하며 그 행을 현재 행으로 만듭니다.

  • LAST
    커서의 마지막 행을 반환하며 그 행을 현재 행으로 만듭니다.

  • ABSOLUTE { n| **@**nvar}
    n 또는 **@**nvar가 양수인 경우에는 커서 맨 앞에서부터 n번째 행을 반환하며 반환되는 행을 새 현재 행으로 만듭니다. n 또는 **@**nvar가 음수인 경우에는 커서 맨 뒤에서부터 n번째 행을 반환하며 반환되는 행을 새 현재 행으로 만듭니다. n 또는 **@**nvar가 0이면 행이 반환되지 않습니다. n은 정수 상수여야 하며 **@**nvar는 smallint, tinyint 또는int여야 합니다.

  • RELATIVE { n| **@**nvar}
    n 또는 **@**nvar가 양수인 경우에는 현재 행에서부터 위로 n번째 행을 반환하며 반환되는 행을 새 현재 행으로 만듭니다. n 또는 **@**nvar가 음수인 경우에는 현재 행에서부터 앞으로 n번째 행을 반환하며 반환되는 행을 새 현재 행으로 만듭니다. n 또는 **@**nvar가 0인 경우에는 현재 행을 반환합니다. n 또는 **@**nvar가 음수로 설정되거나 첫 번째 인출에 있는 0이 커서에 대해 수행되도록 FETCH RELATIVE가 지정된 경우 행이 반환되지 않습니다. n은 정수 상수여야 하며 **@**nvar는 smallint, tinyint 또는int여야 합니다.

  • GLOBAL
    cursor_name이 전역 커서를 참조하도록 지정합니다.

  • cursor_name
    인출이 수행되는 열린 커서의 이름입니다. 동일한 cursor_name을 가진 전역 커서와 로컬 커서가 있는 경우 GLOBAL이 지정되어 있으면 cursor_name이 전역 커서를 참조하고 GLOBAL이 지정되어 있지 않으면 로컬 커서를 참조합니다.

  • **@**cursor_variable_name
    수행할 인출에서 열린 커서를 참조하는 커서 변수의 이름입니다.

  • INTO **@**variable_name[ ,*...*n]
    인출하는 열에서 지역 변수로 데이터를 가져가도록 허용합니다. 목록의 각 변수는 왼쪽에서 오른쪽 순으로 커서 결과 집합의 해당 열과 연관됩니다. 각 변수의 데이터 형식은 반드시 해당 결과 집합 열의 데이터 형식과 일치하거나 암시적 변환이 지원되어야 합니다. 변수의 개수는 커서 선택 목록의 열 수와 일치해야 합니다.

주의

ISO 스타일 DECLARE CURSOR 문에 SCROLL 옵션이 지정되어 있지 않으면 NEXT FETCH 옵션만 지원됩니다. ISO 스타일 DECLARE CURSOR에 SCROLL이 지정되어 있으면 모든 FETCH 옵션이 지원됩니다.

Transact-SQL DECLARE 커서 확장을 사용하는 경우에는 다음 규칙이 적용됩니다.

  • FORWARD_ONLY나 FAST_FORWARD를 지정한 경우에는 유일하게 지원되는 FETCH 옵션이 NEXT입니다.

  • DYNAMIC, FORWARD_ONLY 또는 FAST_FORWARD를 지정하지 않고 KEYSET, STATIC 또는 SCROLL 중 하나를 지정한 경우에는 모든 FETCH 옵션이 지원됩니다.

  • DYNAMIC SCROLL 커서는 ABSOLUTE를 제외한 모든 FETCH 옵션을 지원합니다.

@@FETCH_STATUS 함수는 마지막 FETCH 문의 상태를 보고합니다. sp_describe_cursor에 의해 반환되는 커서의 fetch_status 열에도 동일한 정보가 기록됩니다. 해당 데이터에 대해 어떠한 작업을 수행하려고 시도하기 전에 반드시 이 상태 정보를 사용하여 FETCH 문이 반환하는 데이터의 유효성을 확인해야 합니다. 자세한 내용은 @@FETCH_STATUS(Transact-SQL)를 참조하십시오.

사용 권한

FETCH 사용 권한은 모든 유효한 사용자에게 기본적으로 부여됩니다.

1. 단순 커서에서 FETCH 사용

다음 예에서는 Person.Contact 테이블에 있는 행에 대해 성이 B로 시작하는 단순 커서를 선언하고 FETCH NEXT를 사용하여 한 행씩 진행하는 방법을 보여 줍니다. FETCH 문은 DECLARE CURSOR에 지정된 열에 대한 값을 단일 행 결과 집합으로 반환합니다.

USE AdventureWorks
GO
DECLARE contact_cursor CURSOR FOR
SELECT LastName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName

OPEN contact_cursor

-- Perform the first fetch.
FETCH NEXT FROM contact_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

2. FETCH를 사용하여 변수에 값 저장

다음 예는 FETCH 문의 출력이 클라이언트에게 직접 반환되지 않고 지역 변수에 저장된다는 점 외에는 예 A와 유사합니다. PRINT 문은 변수를 한 문자열로 결합하여 클라이언트에 반환합니다.

USE AdventureWorks
GO
-- Declare the variables to store the values returned by FETCH.
DECLARE @LastName varchar(50), @FirstName varchar(50)

DECLARE contact_cursor CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Perform the first fetch and store the values in variables.
-- Note: The variables are in the same order as the columns
-- in the SELECT statement. 

FETCH NEXT FROM contact_cursor
INTO @LastName, @FirstName

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN

   -- Concatenate and display the current values in the variables.
   PRINT 'Contact Name: ' + @FirstName + ' ' +  @LastName

   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
   INTO @LastName, @FirstName
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

3. SCROLL 커서 선언 및 기타 FETCH 옵션 사용

다음 예에서는 SCROLL 커서를 만들어 LAST, PRIOR, RELATIVE 및 ABSOLUTE 옵션 전체에 스크롤 기능을 허용하는 방법을 보여 줍니다.

USE AdventureWorks
GO
-- Execute the SELECT statement alone to show the 
-- full result set that is used by the cursor.
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

-- Declare the cursor.
DECLARE contact_cursor SCROLL CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Fetch the last row in the cursor.
FETCH LAST FROM contact_cursor

-- Fetch the row immediately prior to the current row in the cursor.
FETCH PRIOR FROM contact_cursor

-- Fetch the second row in the cursor.
FETCH ABSOLUTE 2 FROM contact_cursor

-- Fetch the row that is three rows after the current row.
FETCH RELATIVE 3 FROM contact_cursor

-- Fetch the row that is two rows prior to the current row.
FETCH RELATIVE -2 FROM contact_cursor

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO