SQL SERVER에서 ORACLE 서버로 분산쿼리(Openquery)를 이용해서 데이터를 조회,수정,삭제 가능합니다. Openquery는 fourpartname을 사용하는것 보다 속도가 더 빠릅니다.
Openquery 사용 예
1.openquery 내의 조건절에 직접 cwsonic을 입력하면 OK
-- 조회
-- insert
VALUES ('wonsick','',' ','')
-- delete
1번과 같은 경우는 분산쿼리 내부에 상수를 사용하는 것으로 정상적으로 작동이 가능
2.openquery 밖의 조건절에서 상수값을 변수로 받아 처리하면 OK
SET @codeno ='wonsick'
DELETE OPENQUERY(orainsa, 'select id from cwsonic')
WHERE id=@codeno
2번과 같은 경우도 조건절에 변수를 사용했지만 분산쿼리 바깥단에서 썼기때문에 정상적으로 조회가 됩니다.(단, Table Full Scan 되기 때문에 이런 방식은 사용을 지양해야 합니다.)
3.openquery 내의 조건절에 상수값을 변수로 처리하면 ERROR 발생
SET @HullNo='001553'
SELECT * FROM OPENQUERY(STEELS, 'select * from TATB_GSCAD_IF_ELE_BASIC where HULL_NO=@HullNo') ERROR
조회결과 ---> 오류가 발생
Server: Msg 7321, Level 16, State 2, Line 1
OLE DB 공급자 'MSDAORA'에 대해 실행할 쿼리를 준비하는 중 오류가 발생했습니다.
OLE DB 오류 추적 [OLE/DB Provider 'MSDAORA' ICommandPrepare::
Prepare returned 0x80040e14].
3번과 같은 경우는 분산쿼리 안에 변수를 사용해서 오라클에서 인식을 하지 못해 나오는 error로 SQL문을 변수STRING으로 받아서 실행하면 가능합니다.
DECLARE @strQuery VARCHAR(1024)
SET @HullNo='001553'
SET @strQuery = 'select * from openquery(STEELS, '''
+ ' select id from TATB_GSCAD_IF_ELE_BASIC
where HULL_NO='''
+ @HullNo +'''' + ''')'
EXEC (@strQuery)
가능하면 3번과 같이 STRING으로 받아 처리하는 것을 추천합니다.
출처 : http://www.dbguide.net/dbqa/dbqa120001.jsp?mode=view&divcateno=244&divcateno_=244&pg=1&idx=796