我正在尝试将Oracle数据库表中的记录合并到本地SQL表中。
我有一个名为OWell的包的变量。
我有一个数据流任务,它将Oracle数据作为SQL语句获取(从Well_ID中选择well_id,来自OWell顺序的well_name),然后转换任务以将well_id从长度为15的DT_STR转换为DT_WSTR;并将well_name从长度为15的DT_STR转换为长度为50的DT_WSTR。然后将其存储在记录集OWell中。
转换的原因是我要添加记录的表具有标识字段:SSIS将well_id显示为长度为15的DT_WSTR,well_name为长度为50的DT_WSTR。
然后我有一个SQL任务连接到本地数据库并尝试添加尚未存在的记录。我尝试了各种各样的事情:使用OWell作为结果集并在我的SQL语句中引用它。目前,我将ResultSet设置为None,以及以下SQL语句:
Insert into WELL (WELL_ID, WELL_NAME)
Select OWELL_ID, OWELL_NAME
from OWell
where OWELL_ID not in
(select WELL.WELL_ID from WELL)
对于参数映射,我从我的变量User :: OWell中得到了名为OWell_ID的Paramater 0。名为OWell_Name的参数1来自同一个变量。两者都设置为VARCHAR,虽然我也尝试过NVARCHAR。我没有结果集。
我收到以下错误: 错误:0xC002F210在将记录插入FLEDG,执行SQL任务:执行查询“插入井(WELL_ID,WELL_NAME) 选择OWELL ...“失败并出现以下错误:”将结果提取到类型(DBTYPE_STR)变量时发生错误。可能的失败原因:查询出现问题,“ResultSet”属性设置不正确,参数未设置正确,或连接未正确建立。
我不认为这是一个数据类型问题,而是我不知道我没有正确使用结果集。我究竟应该如何在我的SQL任务中引用该记录集,以便我可以使用这两个记录集字段并添加缺少的记录?
答案 0 :(得分:2)
您的问题是您正在尝试将对象变量读入sql任务,并在sql任务中引用该变量。
要执行您要执行的操作,可以使用foreach循环任务。您可以将a的枚举数设置为对象(记录集)变量,并将其列映射到变量,然后将这些变量作为参数传递到sql任务中。上面示例中的sql代码有另一个缺陷,即您尝试在包中引用变量,就好像它是数据库中的表一样。您需要将sql更改为Insert into well(?,?)
然而,这种方法省略了在插入记录之前可以检查记录是否存在的步骤。更好的整体方法是在数据流中完成所有这些操作。
从您选择的Oracle数据流中执行您正在执行的所有操作。在最后一步,不是使用指向变量USER :: OWell的记录集目标,而是从本地sql表添加查找。将sql语句设置为select WELL.WELL_ID from WELL
。在查找中的列选项卡上,将数据流(左侧的字段)中的Well_ID与查找中的Well_ID(右侧的字段)匹配,方法是将well_id字段从左向右拖动以在框之间形成连接。在对话框的底部,单击“配置错误输出”,并将查找输出行的错误列值设置为“重定向行”。选择确定以保存并关闭此查找。接下来,将oledb目标添加到数据流并将其连接到查找的错误输出(红色箭头)。将目标指向sql表,并将数据流中的列映射到输出表中的相应列。这会将sql表中不存在的oracle数据流中的行传递到sql表的批量插入中。
答案 1 :(得分:1)
为了推断缺失的行,我们使用了查找任务,然后将未完成的行定向到普通的OLEDB目的地(显然你不提供标识列)或(我们在比较整个表的地方){{ 3}}并将新行路由到类似的OLEDB目的地。
SQL Command任务中的单个INSERT非常快。