OLE DB连接结果集失效,SSIS包获取最大日期问题求助
搞定SSIS里OLE DB/ADO拿日期/字符串返回值的坑
咱们先拆解下你遇到的几个核心问题,一步步给你捋明白:
一、为啥OLE DB连接连日期返回值都拿不到?
其实是你在Result Set的配置上搞混了模式,OLE DB对这个的要求可比ADO严多了:
- 你试过把Result Name设为0或者变量名MaxDate,这对应两种不同的Result Set模式:
- 如果选Single Row模式,Result Name必须和查询里的列别名完全一致——比如你得把查询写成
SELECT MAX(YourDateCol) AS MaxDate ...,然后Result Name填MaxDate才行 - 如果选Scalar模式,Result Name必须固定写
0,而且绑定的变量得是Date/DATETIME类型,不能是字符串
- 如果选Single Row模式,Result Name必须和查询里的列别名完全一致——比如你得把查询写成
- 另外,OLE DB对数据类型的兼容性卡得死,如果你的变量类型和查询返回的日期类型不匹配(比如变量是String,但查询返回的是原生Date),直接就拿不到值。
二、ADO能返回日期,但转字符串就拉胯?
ADO本身对日期类型的处理比较宽松,会自动把SQL的Date映射成SSIS的DateTime变量,所以没问题。但转字符串失败,大概率是两个原因:
- 第一,你的SSIS字符串变量长度不够!比如你设成10,但
CONVERT(varchar(25), ...)返回的字符串可能更长,或者你没指定格式导致返回了带时间的字符串,直接截断或者绑定失败 - 第二,SQL Server的
CONVERT函数没指定style参数,默认返回的格式可能是YYYY-MM-DD,而你要的是MM/DD/YYYY,这种情况下如果SSIS变量绑定的时候隐性转换出问题,也拿不到值 - 最后,ADO的Result Set配置也不能乱,和OLE DB一样,Single Row模式要用列别名,Scalar模式用0,而且变量必须是纯String类型。
三、直接给你能拿到'03/06/2018'的解决方案
不管用OLE DB还是ADO,按这几步来绝对能成:
1. 先把查询语句改对,固定格式
用带style参数的CONVERT强制输出你要的格式,比如:
SELECT CONVERT(varchar(10), MAX(YourDateColumn), 101) AS FormattedMaxDate
这里style=101就是标准的
MM/DD/YYYY格式,varchar(10)刚好够装,避免多余字符。
2. 配置Result Set(推荐用Single Row模式,直观不容易错)
- 执行SQL任务的Result Set选项选Single Row
- 在Result Set映射里:
- Result Name填查询里的别名
FormattedMaxDate - 变量选一个String类型的变量(比如
User::MaxDateStr),记得把变量长度设为至少10(留25也没问题,多留点余量)
- Result Name填查询里的别名
3. OLE DB连接的额外小细节
- 如果之前用Scalar模式没成功,赶紧换成Single Row模式,OLE DB对Single Row的兼容性好很多
- 把OLE DB连接管理器的RetainSameConnection属性设为True,避免连接提前释放导致结果丢了
四、再给你补个原理:为啥ADO能返回日期但字符串不行?
ADO内部会自动做类型适配,把SQL的Date类型转成SSIS能识别的DateTime变量,所以没毛病。但返回字符串时,ADO要求SSIS变量必须严格匹配String类型,而且如果查询返回的字符串格式有“意外”(比如带时间戳、格式不对),就会触发绑定失败。而OLE DB对类型校验更苛刻,不管是日期还是字符串,只要Result Set配置错了或者类型不匹配,直接就拿不到结果。
内容的提问来源于stack exchange,提问作者William Burke
相关产品推荐
相关产品推荐

