커서를 대체하는 방법
-- 값 할당용 변수
DECLARE @LOG_TABLE_NAME NVARCHAR(200)
-- 루프 변수
DECLARE @I INT, @MAX_I INT
-- 커서용 테이블 생성
if OBJECT_ID('TEMPDB..#TMP_MANAGER') is not null
DROP TABLE #TMP_MANAGER
SELECT ROW_NUMBER() OVER(ORDER BY LOG_TABLE_NAME) AS ID, *
INTO #TMP_MANAGER
FROM TCM_BATCH_LOG_MANAGE
WHERE IS_USE = 'Y'
-- 할당
SELECT @I = 1, @MAX_I = MAX(ID) FROM #TMP_MANAGER
WHILE @I <= @MAX_I
BEGIN
--FETCH 작업
SELECT @LOG_TABLE_NAME = LOG_TABLE_NAME
FROM #TMP_MANAGER
WHERE ID = @I
-- 이곳에 해당 작업을 한다
-- 다음 작업 및 종료 조건을 위한 @I값 증가
SET @I += 1
END
MS-SQL 은 커서를 사용하셔야 합니다.
아래 예제를 참고하세요..
--------------------------------------------------------------------------------------------
/*
테스트 테이블 생성 및 데이터 입력
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)
*/
----------------------------------------------------------------
-- 커서를 사용
----------------------------------------------------------------
-- 결과를입력할임시테이블
create table #temp(문항 int, 답변자 varchar(10), 답변내용 VARCHAR(100))
-- 커서
DECLARE @문항 int, @답변자 varchar(10), @답변내용 int
DECLARE @CNT INT, @복합답변 VARCHAR(100)
DECLARE MYCUR CURSOR FOR
SELECT 문항,답변자,답변내용
FROM TEST
ORDER BY 문항,답변자,답변내용
OPEN MYCUR
FETCH NEXT FROM MYCUR INTO @문항, @답변자, @답변내용
WHILE (@@FETCH_STATUS=0)
BEGIN
SET @CNT= ISNULL((SELECT COUNT(*) FROM #temp WHERE 문항=@문항 AND 답변자=@답변자),0)
IF @CNT=0
BEGIN
INSERT INTO #temp(문항,답변자,답변내용) values (@문항, @답변자,convert(varchar,@답변내용))
END
ELSE
BEGIN
UPDATE #temp
SET 답변내용=답변내용+','+convert(varchar,@답변내용)
WHERE 문항=@문항 AND 답변자=@답변자
END
FETCH NEXT FROM MYCUR INTO @문항, @답변자, @답변내용
END
CLOSE MYCUR
DEALLOCATE MYCUR
--결과가입력된임시테이블조회
SELECT * FROM #TEMP ORDER BY 답변자,문항
결과
문항 답변자 답변내용
----------- ---------- -----------
1
갑돌이 2
1 홍길동 1,3
2 홍길동 4
3 홍길동 1,2,3