下午好, 我花了大约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
答案 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,并选择上面创建的变量,它运行良好!