오라클 에서 MSsql로 컨버젼 작업을 진행 혹은 반대로 진행 하는 경우가 많다.
 
또한 오라클에서는 이렇게 썼는데 MSsql에서는 어떻게 쓰지? 이렇게 가끔 생각하는 경우가 있다.
 
몇가지 기억나는 순서대로 정리 해 보았다.

아래의 정리내역은 순수하게 기억나는 대로 정리하였기 때문에 실수도 있음을 인정해 달라..ㅋ
 
그래도 나도 가끔 이 정리한 내역을 보면서 유용하게 사용 하곤 한다.
 

항목

처리방식

Outer Join 수정

- 표준 outer join을 사용할 것.

   주의) 표준 outer joun 사용 시 상수의 outer join 주의

   예) FROM v_acl_user acluser, v_acl_dept acldept

        WHERE  acluser.deptid=acldept.deptid(+)

        AND     acldept.useyn ='Y'(+)

    
       => FROM v_acl_user acluser LEFT OUTER JOIN  
                     v_acl_dept acldept ON  acluser.deptid=acldept.deptid 
           AND  acldept.useyn ='Y' 임

        FROM v_acl_user acluser LEFT OUTER JOIN  
                     v_acl_dept acldept ON  acluser.deptid=acldept.deptid

        WHERE  acldept.useyn ='Y' 가 절대 아님

NVL 수정

- NVL => ISNULL

   주의) NVL( 변수, '') 인 경우는 ISNULL 에서 NULL 과 동일하게 인식하므로
             건별로 수정

   예) NVL(a.amount,0)
           => ISNULL(a.amount,0)

Convert 함수

- TO_NUMBER, TO_DATE,TO_CHAR 등의 함수
      => CAST 또는 CONVERT 로 변환

   예) 1) TO_NUMBER(x0.eval_totpoint)
           => CAST(x0.eval_totpoint AS NUMERIC(20,5))

         2) to_char(sysdate,'YYYYMMDD')
            => CONVERT(varchar(8),GETDATE(),112)

String 연결 함수

- || => +

    예) B.id LIKE (A.id || '%')
           => B.id LIKE (A.id + '%')

SUBSTRING 함수

- SUBSTR => SUBSTRING

    예) SUBSTR(up_deptid ,1 ,4)
           => SUBSTRING(up_deptid ,1 ,4)

         SUBSTR(a.nm,4)
           => SUBSTR(a.nm,4,len(a.nm))

상위 1 개 Select

- /*+ first_rows */ => TOP 문 으로 치환

rownum 수정

- TOP 으로 수정

    예) WHERE rownum = 1
            => SELECT TOP 1

- Select 바로 옆의 rownum 은 Cursor 이용함
   - Inline View 형식의 rownum 은 dual 테이블 이용함

LENGTH/LENGTHB

- LENGTH => LEN

   예) LENGTH(up_deptid)
           => LEN(up_deptid)

 - LENGTHB => DATALENGTH

DECODE/Greatest/Least

 - CASE .. WHEN .. ELSE.. END 로 수정

   오라클은 8i(?) 부터 위의 문장이 되므로 오라클도 case사용

LPAD / RPAD

-REPLICATE 및 DATALENGTHB 이용하여 변경

  예) LPAD(to_char(w_seq_no), 4, '0')
         => REPLICATE('0', 4 - DATALENGTH(CONVERT(VARCHAR(4),@w_seq_no))) + CONVERT(VARCHAR(4),@w_seq_no)

        RPAD(' ',depth*3)
          => space(depth*3)

TRIM 함수

  예) TRIM(@v_apprepuserid)
          => RTRIM(LTRIM(@v_apprepuserid))

DATE 연산 함수

- ADDDATE 함수 사용

   예) sysdate + 1
          => ADDDATE(day,1,getdate()) 와 같은 형식으로 변경

INSTR 함수

- CHARINDEX  함수 사용

   예) INSTR(문자열a,문자열b)
          => CHARINDEX(문자열b,문자열a) 와 같이 변경됨

CHR(10)

 CHR(10) => CHAR(10), CHR => CHAR 로 변경

SF 수정 절차

1) varchar2 => varchar로

2) number => numeric

3) 변수 앞에 @ 붙이기 및 Declare 추가

   예제) aaa => @aaa

4) 변수 선언 시 Declare 추가

5) ";" 제외

6) Exception 부분의 no data found 부분 처리

7) IF 문 수정

8) 선언문 수정( :=  => SET 또는 SELECT)

9) INTO 문 없애기

  **기타) Query 문 수정

주의) 함수에서 GETDATE() 함수는 사용 불가

        #Temp table 사용 불가

        함수를 select 문에서 call 할 경우 반드시 owner 이름을 붙인다 => select dbo.sf_get('a'))

SP 수정 절차

* SF 와 거의 유사

Trigger 수정 절차

1) :old, :new 대신 select id from deleted OR select id from inserted 사용

2) SP Call 할 경우 sp_('a','a')=>exec sp_ 'a','a'

3) ON Table 명을 Trigger 명 바로 뒤에

    예제) CREATE TRIGGER tr_t_appline_insert ON t_appline

4) Before Trigger 가 안됨 => FOR 로 대치함

5) FOR EACH 인 경우 Cursor 를 이용하여 Loop 처리

6) old 와 new 를 같이 사용하는 UPDATE의 경우 PK 에 대한 수정은 없다고 가정

  * 나머지 문법적인 요소는 SP/SF 참조

SF 호출

- Store Function 호출 시 반드시 dbower.function 명으로 호출

   예) SELECT sf_appcontent_columnval('a','a')  
           FROM v_voter_d
          => SELECT dbo.sf_appcontent_columnval('a','a')  
              FROM  v_voter_d



다소 지저분하게 정리가 되었다. 위의 테이블은 ORACLE에서 MSSQL로의 CONVERSION 기준으로 정리 하였다.


WRITTEN BY
한량이

,