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

Sql 使用SSIS OLE db命令将数据插入Oracle数据库,sql,oracle,ssis,Sql,Oracle,Ssis,我正在尝试执行insert和update2,当然是将来自SQL源的流分离到Oracle目标。我遵循了此链接中给出的流程: 因为我的目标包含一个使用Oracle序列的列,所以我无法仅使用OLE DB目标或Oracle目标驱动程序,因此我修改了新行路径插入路径以使用OLE DB命令,并在Component Properties sql命令中输入了以下T-sql语句: insert into AWQMSO.FIRM ( FIRM_ID, ACM_FIRM_ID, MSTR_FIRM_ID, ACTV

我正在尝试执行insert和update2,当然是将来自SQL源的流分离到Oracle目标。我遵循了此链接中给出的流程:

因为我的目标包含一个使用Oracle序列的列,所以我无法仅使用OLE DB目标或Oracle目标驱动程序,因此我修改了新行路径插入路径以使用OLE DB命令,并在Component Properties sql命令中输入了以下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 Commandinsert上失败,并显示一条无用的错误消息:

错误: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的派生列,但不带引号。将公司从Nextval改为a?并将值映射到新派生的字段,这给了我一个信息更丰富的错误消息,即数据无法插入到FIRM_ID字段中,但仍然给我留下了相同的问题

我已经成功地使用执行SQL任务将一行插入到Oracle中的统计表中,其中包含使用变量和参数化查询的序列字段。这只是一行,虽然有4列,但我不知道如何重现相同的内容,将数据集的每一行都放入一个变量中,然后执行insert并移动到下一行


提前感谢您的帮助

您可以添加一个脚本任务,该任务将增加数字并检查所需的格式。e、 g.您可以首先从序列中选择下一个值,并将其用作初始值

在oracle表的oledb目标中,您可以将公司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;
    }

}

0x80040E55是DB_E_BADORDINAL的OLEDB错误-指定的列不存在。共享和享受。在实现了一个类似于下面的脚本之后,我们发现DEV-box上的索引一直被破坏,因此上面的原始解决方案工作得很好。