日期:2014-05-17  浏览次数:20756 次

SSIS增量采集oracle数据到sqlserver2005传日期参数
我想用SQLServer2005 Integration Services 从oracle每天增量采集数据,语句为
SELECT PERIOD_NAME, CURRENCY_CODE, SEGMENT1, SEGMENT2, SEGMENT3, AMOUNT_1, AMOUNT_2, AMOUNT_3, AMOUNT_4, AMOUNT_17, AMOUNT_18 FROM XXT.XXT_INF_GENE_DATA_B WHERE PERIOD_NAME = 日期
(PERIOD_NAME是oracle那边的日期字段,类型为varchar2(15),如20120101)
我采用Oracle Provider for OLE DB 数据源驱动时,AMOUNT_1到AMOUNT_18会报精度错误,所以采用Microsoft OLE DB Provider for Oracle驱动
但点击“参数”按钮时编辑器弹出“无法从SQL命令提取参数,提供程序可能无法帮助分析命令中的参数信息,在这种情况下,请使用‘变量中的SQL命令’访问模式”。
这种情况下,我使用‘变量中的SQL命令’访问模式”,当我只建一个名称为‘sql’的变量,将值设为
SELECT PERIOD_NAME, CURRENCY_CODE, SEGMENT1, SEGMENT2, SEGMENT3, AMOUNT_1, AMOUNT_2, AMOUNT_3, AMOUNT_4, AMOUNT_17, AMOUNT_18 FROM XXT.XXT_INF_GENE_DATA_B
时,能运用这个模式采数成功,但是当我多加一个变量‘ETLDATE’时,怎么也加不进去,我加另一个变量的步骤如下:
加上另一个变量,这个变量我暂时写死为某一天,名称为‘ETLDATE’
将sql变量改为SELECT PERIOD_NAME, CURRENCY_CODE, SEGMENT1, SEGMENT2, SEGMENT3, AMOUNT_1, AMOUNT_2, AMOUNT_3, AMOUNT_4, AMOUNT_17, AMOUNT_18 FROM XXT.XXT_INF_GENE_DATA_B WHERE PERIOD_NAME =  @[用户::ETLDATE]。执行报错
然后我换了一种方法,利用脚本任务,
这个是设置好的参数,其中sql参数的全部显示是如下
SELECT PERIOD_NAME, CURRENCY_CODE, SEGMENT1, SEGMENT2, SEGMENT3, AMOUNT_1, AMOUNT_2, AMOUNT_3, AMOUNT_4, AMOUNT_17, AMOUNT_18 FROM XXT.XXT_INF_GENE_DATA_B WHERE PERIOD_NAME ='"& dateString &"' 


脚本的配置,然后点击下方的设计脚本

加入的语句有如下,这个是利用VB将ETLDATE这个DateTime变量,转换为符合oracle数据库那边的PERIOD_NAME字段的String型
Dim dateString As String
dateString = CStr(Dts.Variables("ETLDATE").Value)
Dts.Variables("sql").Value = "SELECT PERIOD_NAME, CURRENCY_CODE, SEGMENT1, SEGMENT2, SEGMENT3, AMOUNT_1, AMOUNT_2, AMOUNT_3, AMOUNT_4, AMOUNT_17, AMOUNT_18 FROM XXT.XXT_INF_GENE_DATA_B WHERE PERIOD_NAME ='"& dateString &"' "
执行成功了,但是数据没有进来,肯定是日期参数的判断是没匹配上,我现在就是不晓得该怎么转
第一次发帖,可能交代的不是很清楚,求助各位大神,谢谢了
------解决方案--------------------
那就看看 dateString  这个是什么值了 ,再结合你的sql 语句看看有无符合条件的数据
------解决方案--------------------
引用:
那就看看 dateString  这个是什么值了 ,再结合你的sql 语句看看有无符合条件的数据


这个是当然的了,肯定是oracle那边有这个日期的数我才采的,问题是,我全量采集可以,加日期条件就不行,原来采数是从sybase的,也是我们公司的系统,这样子日期字段不用怎么改就行,问题是新系统不是我们公司的,他的交易日期字段类型是varchar2(15)的,而我们这边的参数是DateTime的
------解决方案--------------------
参数也用varchar 不就可以了? 也传'20121128'这种
------解决方案--------------------
引用:
参数也用varchar 不就可以了? 也传'20121128'这种


我们公司有一个自己开发的ETL工具,传进来的参数就是DateTime类型的,现在测试环境上还没安装好,所以ETLDATE变量都是写死的日期,不过这个值得一试,我先试下
------解决方案--------------------
convert转为字符串。
------解决方案--------------------
SQL有链接服务器的,可以像本地服务器一样访问,采集数据