개발/SQL
[mssql] 반복문 사용해서 테이블 돌기
카레공
2022. 12. 19. 22:03
- 반복문을 통해 한 테이블의 데이터를 가공하고 싶을때
- 임시테이블을 통해 두세번 데이터를 가공하고 싶을 때
결과값을 만들어 반환할 임시테이블을 선언한다.
-- 로케이션 조편성 임시테이블
DECLARE
@TBL_GROUP_TMP TABLE
(
V_ROW INT IDENTITY(1,1) NOT NULL, -- 자동 인덱스 증가
V_LOC_NM VARCHAR(15),
V_LEVEL INT,
V_GROUP INT
)
-- 반복문 돌고 싶은 테이블에서 값을 가져오고 자동인덱스가 증가하도록 만든다
INSERT INTO @TBL_GROUP_TMP (V_LOC_NM,V_LEVEL)
SELECT loc_nm, High_level
FROM TB_LOCATION_TYPE WITH(NOLOCK, READUNCOMMITTED)
반복문에 필요한 변수를 선언한다
DECLARE @vIndexNow INT, @vMaxIndex INT
SELECT @vIndexNow = MIN(V_ROW), @vMaxIndex = MAX(V_ROW)
반복문사용
WHILE(@vIndexNow <= @vMaxIndex)
BEGIN
--...생략 (@TBL_GROUP_TMP 가공하기)
-- 카운트 증가 실시
SET @vIndexNow = @vIndexNow + 1;
END;
select *
from @TBL_GROUP_TMP
🔽전체 구문 활용
/*
[테이블 변수 선언 및 while 반복문 구문을 사용해 테이블 조회 결과 출력 실시]
1. declare begin end - PL/SQL 기본으로 쿼리, 문법을 실행할 수 있습니다
2. declare [선언부] - 변수, 상수를 선언할 수 있습니다
3. begin [실행부] - 제어, 반복문, 함수 등 다양한 로직 기술을 실행합니다
4. end [종료부] - 실행된 로직의 종료를 선언합니다
5. set [할당] - 선언한 변수에 값을 할당할 수 있습니다
6. print [출력] - 결과물을 출력할 때 사용합니다
7. while - 지정한 단계 만큼 반복문을 수행할 수 있습니다
*/
DECLARE
-- [임시 테이블 변수 부분]
@V_TABLE TABLE
(
V_ROW INT IDENTITY(1,1) NOT NULL, -- 자동 인덱스 증가
V_NAME VARCHAR(100),
V_DEPT VARCHAR(100)
);
-- [임시 테이블에 실제 테이블 데이터 저장 실시]
INSERT INTO @V_TABLE(V_NAME, V_DEPT)
SELECT T_NAME, T_DEPT
FROM TEST_USER
WHERE T_DEPT IN ('백제', '후백제')
ORDER BY T_DEPT DESC;
DECLARE
-- [초기 변수 선언 부분]
@M_ROW_NOW AS INT,
@M_ROW_MAX AS INT,
@M_NAME AS VARCHAR(100),
@M_DEPT AS VARCHAR(100);
-- [반복문 수행 행 변수에 값 삽입 실시]
SELECT @M_ROW_NOW = MIN(V_ROW), @M_ROW_MAX = MAX(V_ROW) FROM @V_TABLE;
-- [WHILE 반복 구문 선언]
WHILE(@M_ROW_NOW <= @M_ROW_MAX)
BEGIN
-- [SELECT 결과 매핑 실시]
SELECT @M_NAME = V_NAME, @M_DEPT = V_DEPT
FROM @V_TABLE
WHERE @M_ROW_NOW = V_ROW;
-- [Print 결과 출력 실시]
PRINT '행 번호 : ' + CONVERT(VARCHAR, @M_ROW_NOW);
PRINT '이름 : ' + CONVERT(VARCHAR, @M_NAME);
PRINT '부서 : ' + CONVERT(VARCHAR, @M_DEPT);
PRINT '';
-- [카운트 증가 실시]
SET @M_ROW_NOW = @M_ROW_NOW + 1;
END;