블로그 이미지

MSSQL Denali의 OFFSET-FETCH 기능 (1)

2011.10.04 18:36 Posted by 건방진연이
이번 Denali 에서는 드디어 OFFSET 기능이 추가가 되었습니다. 제가 알고 있기론 MySQL에는 이 기능이 예전 부터 있었던 것 같아요 ~ ! (없음 말고요 -0-;;;) 간단하게 OFFSET 기능은 해당 결과 ROW에서 OFFSET 에 명시된 수치 만큼 건너 뛰고 출력을 하라는 구문이에요. MSDN에서는 다음과 같이 해석하고 있어요.

OFFSET-FETCH 절은 결과 집합에서 창 또는 페이지로만 결과를 내보낼 수 있는 옵션을 제공합니다. OFFSET-FETCH 절은 ORDER BY절과 만 사용할 수 있습니다.

라고 되어 있어요. MSDN : http://msdn.microsoft.com/ko-kr/library/gg699618(v=sql.110).aspx
간단하게 예제를 통해서 보면 먼저 OFFSET 만을 사용하는 쿼리를 보게 되면
SELECT 
	BusinessEntityID
	,  LoginID
	, JobTitle
FROM HumanResources.Employee
ORDER BY BusinessEntityID
OFFSET 100 ROWS

해당 쿼리에서 OFFSET 구절을 빼고 실행을 하면 290 Rows 가 리턴이 된다. 즉, OFFSET 100 ROWS 을 하게 되면 레코드 처음 부터 100번 째 행까지 스킵을 하고 101번 째 행부터 출력이 된다. 여기에서 FETCH 절을 사용하면
SELECT 
	BusinessEntityID
	,  LoginID
	, JobTitle
FROM HumanResources.Employee
ORDER BY BusinessEntityID
OFFSET 100 ROWS
FETCH NEXT 20 ROWS ONLY;

FETCH NEXT 20 ROWS ONLY; 추가해서 실행을 해보면 101번째 행부터 +20 된 120번째 행까지 출력이 된다. 어디에 어떻게 응용할지 딱히 생각나는 부분은 없지만 좋은 기능인듯 하네요.
SELECT 
	BusinessEntityID
	,  LoginID
	, JobTitle
FROM HumanResources.Employee
ORDER BY BusinessEntityID
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;

이와 같이 OFFSET 시작 수치가 0 이면 처음부터, 그리고 OFFSET-FETCH 는 변수를 바로 사용할 수 있네요. 해당 실행 결과는 직접 해보셔요.
DECLARE @StartRec INT
DECLARE @PageSize INT
DECLARE @RecordEnd INT

SET @StartRec = 0
SET @PageSize = 10
SET @RecordEnd = @PageSize

WHILE @RecordEnd <> 0 -- I'm using WHILE loop to simulate it here
BEGIN
	SELECT 
		BusinessEntityID
		, LoginID
		, JobTitle
	FROM HumanResources.Employee
	ORDER BY BusinessEntityID
	OFFSET @StartRec ROWS
	FETCH NEXT @PageSize ROWS ONLY

	SET @RecordEnd = @@ROWCOUNT -- Exit loop at 0
	SET @StartRec = @StartRec + @PageSize
END
GO
해당 예제 스크립트는 아래 사이트에 있는걸 사용했습니다.
http://sqlwithmanoj.wordpress.com/category/ms-sql-server-denali/
  1. Favicon of https://dev100.tistory.com BlogIcon 쥐잡종 2014.07.30 11:31 신고  address  modify / delete  reply

    좋은 기능인건 알았으나... mssql 2012 이상에서만 사용이 가능하다 라 하더군요..
    2005, 2008 에서 해당 기능을 사용할려 했으나 계속 안되서 힘들게 찾았네요 ^^..

    주의사항 등에 mssql 버전 몇 이상부터 사용가능한지도 넣어주시면 좋겠네요..