다음을 통해 공유


FETCH(Transact-SQL)

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

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은 정수 상수여야 하며 @nvarsmallint, tinyint 또는 int이어야 합니다.

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

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

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

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

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

설명

SCROLL 옵션이 ISO 스타일 DECLARE CURSOR 문에서 지정되지 않은 경우 NEXT가 유일하게 지원되는 FETCH 옵션입니다. SCROLL이 ISO 스타일 DECLARE CURSOR 문에서 지정되는 경우 모든 FETCH 옵션이 지원됩니다.

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

  • FORWARD_ONLY 또는 FAST_FORWARD를 지정하면 NEXT가 유일하게 지원되는 FETCH 옵션입니다.

  • 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 권한은 기본적으로 모든 유효한 사용자에게 부여됩니다.

예제

A. 단순 커서에서 FETCH 사용

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

USE AdventureWorks2022;  
GO  
DECLARE contact_cursor CURSOR FOR  
SELECT LastName FROM Person.Person  
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  

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

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

USE AdventureWorks2022;  
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.Person  
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  

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

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

USE AdventureWorks2022;  
GO  
-- Execute the SELECT statement alone to show the   
-- full result set that is used by the cursor.  
SELECT LastName, FirstName FROM Person.Person  
ORDER BY LastName, FirstName;  
  
-- Declare the cursor.  
DECLARE contact_cursor SCROLL CURSOR FOR  
SELECT LastName, FirstName FROM Person.Person  
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  

참고 항목

CLOSE(Transact-SQL)
DEALLOCATE(Transact-SQL)
DECLARE CURSOR(Transact-SQL)
OPEN(Transact-SQL)