개발/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;