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 中,这会插入一行。当我在 SSIS 中运行 SQL(不带分号和提交工作语句)时,我从 MyOracleTableName 得到主键违规。

我已经验证了来自 SSIS 的截断是在 Oracle 中提交的。

当我在 PLSQL Developer 中运行上面的 SQL 并用 union all 替换 union 时,我看到第二行并且插入因 PK 违规而失败。因为它应该与一个联合都允许重复。

这是目前使用 MSDAORA 的 SSIS 2005 包的一部分,它工作得很好。我现在正在使用 Oracle 的本机 OLE DB 提供程序在 SSIS 2008 中重写。

我无法在新环境中使用 MSDAORA。这是一个驱动程序问题吗?除了将它们分成多个语句,第二个语句只插入 MyOracleTableName 中没有的内容之外,还有其他解决方法吗?

问候。

4

1 回答 1

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) 一次,从而将单行呈现给我的主键约束。

谢谢你。

于 2012-10-11T15:20:18.367 回答