使用SSIS OLE DB命令将数据插入Oracle数据库

时间:2014-08-02 19:10:52

标签: sql oracle ssis

我正在尝试从SQL源到Oracle目标进行插入和更新(当然是2个单独的流)。我按照此链接中给出的过程: http://sqlblog.com/blogs/andy_leonard/archive/2007/07/09/ssis-design-pattern-incremental-loads.aspx

因为我的目标包含使用Oracle序列的列,所以我无法仅使用OLE DB目标或Oracle目标(attunity驱动程序),因此我修改了新行路径(插入路径)以使用OLE DB命令并在Componenent Properties SQL Command中输入以下T-sql语句:

insert into AWQMSO.FIRM (
FIRM_ID,
ACM_FIRM_ID,
MSTR_FIRM_ID,
ACTV_IND,
FIRM_STAT_TXT,
CRTE_BY_USR_ID,
CRTE_DTTM,
LST_UPDT_BY_USR_ID,
LST_UPDT_DTTM)
values (
FIRM_SEQ.Nextval,
?,
?,
?,
?,
?,
?,
?,
?)

然后,程序包在OLE DB命令(插入)上失败,并显示一条无用的错误消息:

错误:0xC0202009在数据流任务,OLE DB命令1 [571]:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E55。

重复152次...应插入目标表的确切行数。

然而,使用类似的T-sql语句,更新路径工作正常(几乎......仍在与日期格式作斗争):

Update AWQMSO.FIRM
set
FIRM_STAT_TXT = ?
,ACTV_IND = ?
,LST_UPDT_BY_USR_ID = ?
where ACM_FIRM_ID = ?

我能看到的唯一区别是.Nextval的硬编码,所以我尝试创建一个包含" FIRM_SEQ.Nextval"的派生列。没有引号。将FIRM_SEQ.Nextval更改为?并将值映射到新派生的字段,这给了我一个更丰富的错误消息,表明数据无法插入到FIRM_ID字段中,但仍然存在同样的问题。

我已经成功使用了一个执行SQL任务,使用变量和一个paremeterized查询将一行插入到Oracle的统计表中。这只有一行但有4列,我不知道如何重现同样的事情来将我的数据集的每一行都变成一个变量然后执行插入并移动到下一行。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以添加一个脚本任务,该任务会增加数量并检查所需的格式。例如您可以先从序列中选择nextval并将其作为初始值。

在oledb目的地(对于oracle表),您可以将公司ID映射到脚本任务的输出值。

要创建脚本任务,您可以使用以下代码:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    int i;
    public override void PreExecute()
    {
        base.PreExecute();
        i = 0; //************initialize this to the nextval sequence value
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        i++;
        Row.FirmID = i;
    }

}