커서
- 테이블에서 여러개의 행을 쿼리한 후에 쿼리의 결과인 행 집합을 한 행씩 처리하기 위한 방식이다.
- 한행씩 읽어 나간다.
- 임시테이블과 함께쓰면 각 테이블에서 원하는 데이터를 수집해서 원하는 테이블을 만들수 있다.
커서의 처리순서
커서 선언(DECLARE)
커서열기(OPEN)
데이터가져오기(FETCH NEXT FROM "CURSOR_NAME" INTO 파라미터)
WHILE(@@FETCH_STATUS = 0)
(
데이터 처리(쿼리문)
데이터가져오기(FETCH NEXT FROM "CURSOR_NAME" INTO 파라미터)
)
커서 닫기(CLOSE)
커서해제(DEALLOCATE)
ERROR :
오류메시지(RAISERROR(@ERRMSG,18,1))
커서 닫기(CLOSE)
커서해제(DEALLOCATE)
RETURN
ERROR2 : 오류메시지(RAISERROR(@ERRMSG,18,1))
커서 예제
테스트 테이블 생성 및 데이터 입력
1 2 3 4 5 6 7 8 9 10 | create table TEST(문항int, 답변자varchar(10), 답변내용int) insert into test values (1,'홍길동',1) insert into test values (1,'갑돌이',2) insert into test values (1,'홍길동',3) insert into test values (2,'홍길동',4) insert into test values (3,'홍길동',1) insert into test values (3,'홍길동',2) insert into test values (3,'홍길동',3) | cs |
테이블
문항 답변자 답변내용
----------- ---------- -----------
1 홍길동 1
1 갑돌이 2
1 홍길동 2
2 홍길동 4
3 홍길동 1
3 홍길동 2
3 홍길동 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | -- 결과를입력할임시테이블 CREATE TABLE #temp(문항 INT, 답변자 VARCHAR(10), 답변내용 VARCHAR(100)) -- 커서에 사용할 변수선언 DECLARE @V_문항 INT, @V_답변자 VARCHAR(10), @V_답변내용 INT DECLARE @V_CNT INT, @V_복합답변 VARCHAR(100) --커서 선언 DECLARE MYCUR CURSOR FOR SELECT 문항,답변자,답변내용 FROM TEST ORDER BY 문항,답변자,답변내용 --커서 열기 OPEN MYCUR --첫행을 읽어서 SELECT 순서대로 변수에 대입 FETCH NEXT FROM MYCUR INTO @V_문항, @V_답변자, @V_답변내용 --첫행을 에러없이 뽑았다면 @@FETCH_STATUS 는 0을 반환한다. --더이상 읽을 행이 없다면 WHILE문을 종료한다. WHILE (@@FETCH_STATUS = 0) -- 뽑은 변수를 가지고 BEGIN-END실행 BEGIN SET @CNT = ISNULL((SELECT COUNT(*) FROM #temp WHERE 문항=@V_문항 AND 답변자=@V_답변자),0) IF @CNT = 0 BEGIN INSERT INTO #temp(문항,답변자,답변내용) values (@V_문항, @V_답변자, convert(varchar,@V_답변내용)) END ELSE BEGIN UPDATE #temp SET 답변내용=답변내용+','+convert(varchar,@P_답변내용) WHERE 문항=@V_문항 AND 답변자=V_@답변자 END -- 다음 행을 읽어서 변수로 대입한다. FETCH NEXT FROM MYCUR INTO @V_문항, @V_답변자, @V_답변내용 END -- 커서를 닫고, 할당을 해제한다. CLOSE MYCUR DEALLOCATE MYCUR --결과가 입력된 임시테이블 조회 SELECT * FROM #TEMP ORDER BY 답변자,문항 | cs |
결과
문항 답변자 답변내용
----------- ---------- -----------
1 갑돌이 2
1 홍길동 1,3
2 홍길동 4
3 홍길동 1,2,3
'SQL > MS-SQL' 카테고리의 다른 글
순위관련 WINDOW FUNCTION (0) | 2017.09.07 |
---|---|
트리거(Trigger) (0) | 2017.09.06 |
UNION ALL로 소계, 합계 구하기 (0) | 2017.09.05 |
CHOOSE, IIF 논리함수 (0) | 2017.09.05 |
특정경우를 만족하는 행 SELECT (0) | 2017.09.04 |