좀더 공부를 해 봐야 하겠지만...

Oracle 에만 있던 기능을 찾던 중 2005에서 제공하기 시작한 CTE 기능을 알게 되었습니다.

= 아래 쿼리는 www.datasarang.net 사이트에서 발췌했습니다.
WITH MYCAL AS
(
 SELECT
  CAST('1900-01-01' AS DATETIME) DT
  , IDX = 1
 UNION ALL
 SELECT
  DT + 1
  , IDX + 1
 FROM MYCAL
 WHERE
  DT + 1 <= '2050-12-31'
)
SELECT
   IDX
 , [DT]
 , [DT_1]  = DATEADD(DD, -1, DT)
 , [YMD]   = CONVERT(CHAR(8), DT, 112)
 , [YY]   = DATEPART(YEAR, DT)
 , [MM]   = DATEPART(MONTH, DT)
 , [DD]   = DATEPART(DAY, DT)
 , [WKDAY_SEQ] = DATEPART(DW, DT) 
 , [QTR]   = DATEPART(QQ, DT)
 , [ANIMAL]  = CASE DATEPART(YEAR, DT) % 12 - 3
      WHEN 1 THEN '자' WHEN 2 THEN '축' WHEN 3 THEN '인'
      WHEN 4 THEN '묘' WHEN 5 THEN '진' WHEN 6 THEN '사'
      WHEN 7 THEN '오' WHEN 8 THEN '미' WHEN 9 THEN '신'
      WHEN 10 THEN '유' WHEN 11 THEN '술' WHEN 12 THEN '해' END
FROM MYCAL
OPTION (MAXRECURSION 0)

이 쿼리를 MS SQL 2005 에서 돌려보시기 바랍니다.

저는 위 기능을 이렇게 사용했습니다.

WITH MYCAL AS
(
 SELECT
  CAST('37001' AS int) DT
  , IDX = 1
 UNION ALL
 SELECT
  DT + 1
  , IDX + 1
 FROM MYCAL
 WHERE
  DT + 1 <= '87100'
)
insert into insertTest
SELECT
   IDX
, DT, cast(IDX as varchar) + '_' + cast(DT as varchar) IDVALUE
FROM MYCAL
OPTION (MAXRECURSION 0)

아핫... ㅋㅋ

5만백건... 단 2초에 들어갑니다.

좋아좋아...

행복한 하루입니다.

행복한 고수되셔요...

woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Datasarang 덕분에 여러번 인서트해야만 했던, 그래서 수만 시간 걸려야 했던 작업을 순식간에 처리할 수 있을 것 같습니다.

반응형

+ Recent posts