mssql에서 커서(cursor)를 이용하여 select한 결과로 얻은 데이터셋을 행단위로 하나씩 반복작업을 수행할 수 있습니다.
웹에서 select한 결과의 데이터셋을 읽어온 후에 for loop를 이용하여 행단위 작업을 할 수도 있겠지만
mssql db 자체에서 cursor를 이용한다면 궂이 웹에서의 처리가 필요없으므로 웹소스가 심플해 질 수 있습니다.
mssql 커서 사용 시 성능이슈
mssql에서 커서(cursor)를 사용하면 db성능을 떨어뜨릴 수 있습니다. 처리할 데이터가 적은 경우에는 거의 문제가 없겠지만 대량의 데이터를 처리하는 경우에는 성능저하의 원인이 되므로 커서를 사용하지 않는 것이 좋겠습니다.
mssql cursor 사용 시 자주 사용하는 키워드
DECLARE : 커서를 정의(선언)해 줍니다.
OPEN : 결과 데이터셋의 첫번째 행을 가리키도록 설정합니다.
FETCH : 결과 데이터셋의 다음 행으로 커서를 이동합니다.
CLOSE : 커서를 닫습니다.
다음은 실무에서 사용한 mssql 프로시저 내에서 코딩한 커서 예제입니다.
특정 조건이 만족하면 begin ~ end 사이의 커서 구문을 실행합니다.
if @status = '1'
begin
DECLARE MyCUR CURSOR FOR
Select cNo from t_customer with (nolock) where id=@user_id
OPEN MyCUR
FETCH NEXT FROM MyCUR INTO @conNo
WHILE @@FETCH_STATUS = 0
BEGIN ------------
set @m_status = ''
SELECT @m_status=m_status, @s_code=s_code FROM TB_CUST with (nolock) where cust_no =@conNo
if @m_status <> ''
Update t_customer set cStat=@m_status, s_code=@s_code where cNo = @conNo
FETCH NEXT FROM MyCUR INTO @conNo
END ------------
CLOSE MyCUR
DEALLOCATE MyCUR
end
각각의 동작을 설명하면 다음과 같습니다.
DECLARE MyCUR CURSOR FOR -> DECLARE [커서이름] CURSOR FOR
커서이름을 정의해 줍니다. 예제에서는 MyCUR라고 선언하였습니다.
Select cNo from t_customer with (nolock) where id=@user_id
where절에 조건을 주어 특정 데이터셋을 불러옵니다.
예제에서는 cNo 컬럼값을 가져왔습니다.
OPEN MyCUR
FETCH NEXT FROM MyCURINTO @conNo
커서를 열고 처음 데이터로 가리킵니다.
이때 처음 데이터는 cNo컬럼값 중 첫번째 데이터인데 이 값을 @conNo 에 담습니다.
WHILE @@FETCH_STATUS = 0
BEGIN
이제 데이터셋이 없을 때까지 반복을 시작합니다.
이 다음부터 End 구문을 만날 때까지 실질적인 데이터 처리 루틴이 됩니다.
set @m_status = ''
@m_status 값을 초기화합니다.
SELECT @m_status=m_status, @s_code=s_code FROM TB_CUST with (nolock) where cust_no =@conNo
TB_CUST 테이블에서 특정 조건에 부합하는 컬럼(m_status, s_code)값을 가져옵니다.
if @m_status <> ''
Update t_customer set cStat=@m_status, s_code=@s_code where cNo = @conNo
@m_status에 값이 있는 경우 t_customer 테이블을 갱신합니다.
FETCH NEXT FROM MyCUR INTO @conNo
다음 행으로 이동합니다.
CLOSE MyCUR
DEALLOCATE MyCUR
커서를 닫고 초기화합니다.
여기까지의 핵심적인 코드를 좀 더 간단하게 요약정리하면 다음과 같습니다.
DECLARE MyCUR CURSOR FOR
Select cNo from t_customer with (nolock) where id=@user_id
OPEN MyCUR
FETCH NEXT FROM MyCUR INTO @conNo
WHILE @@FETCH_STATUS = 0
BEGIN ------------
--여기에 반복작업을 할 구문들을 넣습니다.
FETCH NEXT FROM MyCUR INTO @conNo
END ------------
CLOSE MyCUR
DEALLOCATE MyCUR
이상으로 mssql 커서 사용법에 대해서 알아보고 정리해 보았습니다.
감사합니다.
IIS 헤더에 서버 정보 숨기기 (0) | 2021.12.01 |
---|---|
[MSSQL] 링크드 서버(MySQL) 사용 시 openquery로 쿼리 속도 빠르게 하기 (0) | 2021.11.30 |
브라우저(엣지,크롬)에서 간편하게 유튜브 동영상을 다운로드하는 방법 - SaveFrom (0) | 2021.10.20 |
윈도우 서비스 삭제하는 방법 sc delete (0) | 2021.07.28 |
네이버 블로그 서로이웃 관리 프로그램 통계빈 (0) | 2021.07.28 |
댓글 영역