SQL Server和ORACLE之间的SSIS可变日期失败

时间:2018-09-20 13:52:23

标签: sql oracle ssis

下午好, 我花了大约6个小时来尝试使用最大日期变量将格式设置为通过SSIS进行识别,以识别到where子句中-只是没有运气!

我创建了一个名为my_date的变量,该变量从本地SQL Server表中获取Max(Date)以了解该表的最后一个加载点-使用以下代码:

SELECT        CAST(FORMAT(MAX(Business_Date), 'dd-MMM-yyyy') AS varchar) AS my_date FROM Table

这将正确获取日期为2018年9月17日。

然后我将结果集映射为my_date-> User :: max_date

我已在包范围内将max_date变量设置为字符串数据类型。

我已经通过使用断点测试了我的变量,以确保其始终以正确的格式运行-并且可以100%运行。

然后,我有一个数据流任务正在运行,以从我的ORACLE DB中获取数据以插入到包含以下SQL命令的SQL Server表中:

SELECT *
FROM            Table2
WHERE        (BUSINESS_DATE > to_date('@[User::max_date]', 'DD-MON-YYYY'))

但是我得到了ORA-01858-[TABLE]错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E07。 OLE DB记录可用。来源:“ Microsoft OLE DB Provider for Oracle”结果:0x80040E07说明:“ ORA-01858:在非预期的数字位置发现了非数字字符 “。

如果我直接用语言环境中的断点显示的变量的内容替换我的变量,则效果很好!

从最初的导出到最终的where子句,我尝试了多种格式类型,这似乎是我最接近采用的格式,但是它仍然在抱怨格式。

请帮助-以下图片可帮助您查看设置。

Control Flow - displaying the execute SQL and the data flow task

Locale showing Variable is inserting after breakpoint is reached

2 个答案:

答案 0 :(得分:0)

尝试在“参数”下的“ OLE DB数据源编辑器”中映射用户参数。

1)更改SQL命令文本(将@ [User :: max_date]更改为?),如下所示:

SELECT *
FROM            Table2
WHERE        (BUSINESS_DATE > to_date('?', 'DD-MON-YYYY'))

2)然后在参数编辑器中,将参数1映射到@ [User :: max_date]。 https://docs.microsoft.com/en-us/sql/integration-services/data-flow/map-query-parameters-to-variables-in-a-data-flow-component?view=sql-server-2017

此外,“用于OLE DB的Oracle Provider”的行为与“用于Oracle的Microsoft OLE DB Provider”的行为不同,因此取决于您使用的是哪种。

答案 1 :(得分:0)

设法使其正常工作!

通过添加一个中间变量,其中值和表达式包含以下内容:

"SELECT        *
FROM            TABLE
WHERE        (BUSINESS_DATE > to_date('"+@[User::max_date]+"' , 'DD-MON-YYYY'))"

然后我将源OLEDB从变量修改为SQL Command,并选择上面创建的变量,它运行良好!