SQLServer

OFFSET 및 FETCH

하람윤슬아빠 2020. 1. 13. 16:36

테스트 환경

 - OS : Windows 2008 R2 DataCenter

 - DBMS : SQL Server 2012 Enterprise Edition + SP4

 - 참고문서 : https://docs.microsoft.com/ko-kr/previous-versions/sql/sql-server-2012/ms188385(v=sql.110)

 

내용

 

개요

 

행의 수를 제한 할 경우 보통 TOP 키워드를 사용했습니다.

SQL Server 2012 부티 새롭게 지원되는 OFFSET 및 FETCH 를 사용하여 행 수 제한이 가능하다.

MS 에서는 OFFSET 및 FETCH 를 사용하여 행 수 제한하는 것을 권장합니다.


TOP 절 대신 OFFSET 및 FETCH 절을 사용하여 쿼리 페이징 솔루션을 구현하고 클라이언트 응용 프로그램으로 보내는 행 수를 제한하는 것이 좋습니다.

 

 

구문

ORDER BY order_by_expression
[ COLLATE collation_name ]
[ ASC | DESC ]
[ ,...n ]
[ ]


::=
{
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[
FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
]
}

 

인수

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
쿼리 식에서 행을 반환하기 전에 건너뛸 행 수를 지정합니다. 값은 0보다 크거나 같은 정수 상수 또는 식일 수 있습니다.

offset_row_count_expression은 변수, 매개 변수 또는 상수 스칼라 하위 쿼리일 수 있습니다. 하위 쿼리를 사용하는 경우 외부 쿼리 범위에 정의된 열을 참조할 수 없습니다. 즉, 외부 쿼리와 상관 관계를 만들 수 없습니다.

ROW와 ROWS는 ANSI 호환성을 위해 제공되는 동의어입니다.

쿼리 실행 계획에서 오프셋 행 개수 값은 TOP 쿼리 연산자의 Offset 특성에 표시됩니다.



FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
OFFSET 절을 처리한 후에 반환할 행 수를 지정합니다. 값은 1보다 크거나 같은 정수 상수 또는 식일 수 있습니다.

fetch_row_count_expression은 변수, 매개 변수 또는 상수 스칼라 하위 쿼리일 수 있습니다. 하위 쿼리를 사용하는 경우 외부 쿼리 범위에 정의된 열을 참조할 수 없습니다. 즉, 외부 쿼리와 상관 관계를 만들 수 없습니다.

FIRST와 NEXT는 ANSI 호환성을 위해 제공되는 동의어입니다.

ROW와 ROWS는 ANSI 호환성을 위해 제공되는 동의어입니다.

쿼리 실행 계획에서 오프셋 행 개수 값은 TOP 쿼리 연산자의 Rows 또는 Top 특성에 표시됩니다.

 

예제

 

-- 정수 상수를 사용하여 OFFSET 및 FETCH 값 지정

USE AdventureWorks2012;
GO
-- Return all rows sorted by the column DepartmentID.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID;

-- Skip the first 5 rows from the sorted result set and return all remaining rows.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID OFFSET 5 ROWS;

-- Skip 0 rows and return only the first 10 rows from the sorted result set.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;

 

-- 변수를 사용하여 OFFSET 및 FETCH 값 지정

USE AdventureWorks2012;
GO
-- Specifying variables for OFFSET and FETCH values
DECLARE @StartingRowNumber tinyint = 1
, @FetchRows tinyint = 8;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC
OFFSET @StartingRowNumber ROWS
FETCH NEXT @FetchRows ROWS ONLY;