2012-10-10 4 views
2

나는 실행 PLSQL 개발자에서오라클 유니언이 SSIS에서 복제본을 만드는 이유는 무엇입니까? PLSQL에서

truncate table MyOracleTableName; 
commit work; 

insert into MyOracleTablename 
select a,b,c,trunc(sysdate) as datadate 
from AnotherOracleTableName 
where there is a ton of nasty criteria 

union 
select a,b,c,trunc(sysdate) as datadate from AnotherOracleTableName 
where there is a ton of different nasty criteria; 
commit work; 

이 하나 개의 행을 삽입합니다. SSIS에서 세미 콜론 및 커밋 작업 문없이 SQL을 실행하면 MyOracleTableName에서 기본 키 위반이 발생합니다.

SSIS의자를 오라클에서 수행했음을 확인했습니다.

위의 SQL을 PLSQL Developer에서 실행하고 공용체를 모두 공용체로 바꾸면 두 번째 행이 표시되고 PK 위반으로 인해 삽입이 실패합니다. 그것이 노동 조합이 모두 복제물을 허용해야하는 것처럼.

이것은 현재 잘 작동하는 MSDAORA를 사용하는 SSIS 2005 패키지의 일부입니다. 저는 Oracle 용 Native OLE DB 공급자를 사용하여 SSIS 2008에서 다시 작성하고 있습니다.

내 새로운 환경에서 MSDAORA를 사용할 수 없습니다. 이것은 드라이버 문제이며, 둘째로 MyOracleTableName에없는 것만 삽입하는 여러 문장으로 나누는 것 이외의 다른 방법이 있습니까?

감사합니다.

+0

'SELECT .... UNION .... SELECT'에 따라 'MERGE INTO MyOracleTablename ...'을 수행하면 문제가 발생하지 않습니다. 그러나 UNION은 중복 된 행을 피해야합니다. – Annjawn

+0

Annjawn, 병합하려면 여전히 내 SQL을 두 개의 문으로 분할하고 일치하는 부분을 삽입해야합니다. 나는 그것이 SSIS 패키지를 두 배로하는 것을 피하려고 노력했다. 그래도 감사합니다. 그것을 시험해 보는 것은 흥미있는 타는 것이었다. –

+0

Nicholas에게 코드 작성에 감사드립니다. –

답변

0

저녁 식사 후 문제를 파악했습니다.

기본 키 제약 조건은 열 A와 B의 복합 키입니다. 열은 a, b, c 열과 날짜에 대한 중복을 제한합니다. Oracle에서 trunc (sysdate)는 mm/dd/yyyy를 반환합니다. SSIS에서 trunc (sysdate)가 두 번째 또는 밀리 초로 파싱됩니다. 이로 인해 타임 스탬프로 인해 두 개의 고유 한 행 (SQL Server 및 Microsoft에 있음)이 생성 된 다음 열 a, b 및 c가 복제 된 중복 행을 삽입하려고 시도합니다.

해결책은 이것이다 :

truncate table MyOracleTableName; 
commit work; 

insert into MyOracleTablename 
select a.*, 
     trunc(sysdate) as datadate 
from(
select a,b,c 
from AnotherOracleTableName 
where there is a ton of nasty criteria 

union 
select a,b,c from AnotherOracleTableName 
where there is a ton of different nasty criteria) a 

commit work; 

이 중복을 죽일 노조를 허용하고 TRUNC (SYSDATE)를 한 번하여 내 기본 키 제약 조건에 단일 행을 제시를 실행합니다.

감사합니다.

관련 문제