프로그래밍/DB, SQL, EF

[MSSQL] 셀랙트된 결과를 이용하여 일괄 처리하기 - cursor

당근천국 2013. 8. 19. 14:00

쿼리를 짜다 보면 셀랙트된 결과 테이블을 이용하여 저장 프로시저를 호출한다거나 각 데이터(Row)에 따른 다른 처리가 필요할 때가 있습니다.

예를 들면 '사원1'의 영업실적을 상위 상관들에게 누적하기 위한 저장 프로시저가 있다면 영업사원 숫자만큼 저장 프로시저를 호출해야 하죠.

 

이런 행단위 처리를 할 때 사용하는 것이 '커서(cursor)'입니다.

(참고 : 커서(SQL Server Compact Edition))

 

 

 

1. 커서의 이해

MSDN을 보면 눈이 돌아갈 정도입니다-_-;;

지금 당장 우리에게 필요한 건 단순히

"검색된 결과 테이블의 행만큼 저장 프로시저를 호출하고 싶다."

입니다.

 

커서는 이름처럼 데이터 자체를 조작하는 역활이 아닌 데이터의 위치를 알려주는 역활입니다.

그렇기 때문에 다음 칸의 데이터를 가지고 오고 싶다면 'Fetch Next From'를 이용하여 커서를 이동시켜 줘야 하죠.

 

 

 

커서의 사용

커서를 사용할 때는 다음 단계를 따릅니다.

 

1) Declare를 이용하여 커서를 선언한다.

Declare cursorUser cursor
	For Select UserID
		From @tableUser;

 

2) 커서를 연다(Open)

Open cursorUser;

 

3) 첫 번째 데이터를 불러온다. (Fetch)

Fetch Next From cursorUser Into @sTempUserID;

 

4) 반복 작업 후 다음 데이터로 이동

While(@@FETCH_STATUS <> -1)
Begin;
	--원하는 작업 수행
	Exec spCursorTest @sTempUserID;

	--다음 결과 데이터로 이동
	Fetch Next From cursorUser Into @sTempUserID;
End;

 

5) 커서를 닫고 메모리 반환하기

Close cursorUser;
Deallocate cursorUser;

 

 

2. 사용하기

간단한 전체 예제를 보시겠습니다.

--리스트 임시로 받을 테이블
Declare	@tableUser Table
( UserID nvarchar(32));

--조건에 맞는 결과 검색
Insert @tableUser Select UserID	
					From tb_Cursor
					Where Count < 3;

--커서 생성
--기준이 되는 결과 테이블을 지정한다
Declare cursorUser cursor
	For Select UserID
		From @tableUser;

--커서 열기 
Open cursorUser;

--커서의 데이터 지정용 임시 변수
Declare @sTempUserID nvarchar(32);

--커서를 결과 테이블의 첫 데이터로 지정한다.
Fetch Next From cursorUser Into @sTempUserID;

--반복 작업 시작
While(@@FETCH_STATUS <> -1)
Begin;
	--원하는 작업 수행
	Exec spCursorTest @sTempUserID;

	--다음 결과 데이터로 이동
	Fetch Next From cursorUser Into @sTempUserID;
End;

--커서 닫기
Close cursorUser;
Deallocate cursorUser;

 

이 예제에서는 임시테이블을 이용하여 데이터를 먼저 검색했지만 별다른 처리가 필요 없다면 임시테이블을 사용하지 않고 커서를 생성할 때 데이터를 정렬해도 됩니다.

 

'While' 안에서 필요한 작업을 하시면 됩니다.

 

 

마무리

이런 식으로 커서를 사용하면 일반적인 쿼리보다 느립니다.

그러니 최대한 다른 방법을 사용하는 것이 좋죠.

 

물론 어떻게 쿼리를 만드냐에 따라 이 방법이 더 좋을 수도 있지만 말이죠 ㅎㅎㅎ