2

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;

PLSQL Developer では、これにより 1 行が挿入されます。SSIS で SQL (セミコロンとコミット作業ステートメントなし) を実行すると、MyOracleTableName から主キー違反が発生します。

SSIS からの切り捨てが Oracle でコミットされていることを確認しました。

上記の SQL を PLSQL Developer で実行し、union を union all に置き換えると、2 行目が表示され、挿入は PK 違反で失敗します。重複を許可するユニオンの場合と同様です。

これは現在、MSDAORA を使用する SSIS 2005 パッケージの一部であり、問​​題なく動作します。私は現在、Oracle 用のネイティブ OLE DB プロバイダーを使用して SSIS 2008 で書き直しています。

新しい環境で MSDAORA を使用できません。これはドライバーの問題ですか。これらを複数のステートメントに分割して、2 番目のステートメントが MyOracleTableName にまだ含まれていないものだけを挿入する以外に回避策はありますか?

よろしく。

4

1 に答える 1

0

私は夕食後に問題を理解しました。

主キー制約は、列 A と B の複合キーです。ユニオンは、列 a、b、c および日付の重複除外を行います。Oracle では、trunc(sysdate) は mm/dd/yyyy を返します。SSIS では、trunc(sysdate) は秒単位またはミリ秒単位で解析されます。これにより、タイムスタンプにより (SQL Server および Microsoft に対して) 2 つの一意の行が作成され、列 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) を 1 回実行して、単一の行を主キー制約に提示できます。

ありがとうございました。

于 2012-10-11T15:20:18.367 に答える