【问题标题】:Data flow task not updating SQL Server table from oracle db数据流任务未从 oracle db 更新 SQL Server 表
【发布时间】:2014-09-26 18:24:26
【问题描述】:

我对使用 MS Visual Studios 和创建包完全陌生。

话虽如此,我创建了一个包,它应该运行 SQL 任务编辑器(从 Oracle db 中提取数据),然后使用数据流任务,使用 OLE DB 连接来更新 SQL Server 上的表。

我的 sql 编辑器任务使用“变量中的 sql”选项,该选项在代码中包含上次运行日期变量(变量 LastRunDate 应查看 SQL 服务器表中的字段,以了解程序包上次成功运行的日期)。使用此日期,它应该将在此日期之后输入的 Oracle 数据库数据拉入 SQL Server 表中。 sql 编辑器任务运行良好;但是,当随后调用数据流时,OLE DB 源错误并显示

[OLE DB 源 [1]] 错误:SSIS 错误代码 DTS_E_OLEDBERROR。
发生 OLE DB 错误。
错误代码:0x80040E14。有一条 OLE DB 记录可用。
来源:“Microsoft OLE DB Provider for Oracle”Hresult:0x80040E14
描述:“ORA-00923:在预期的地方找不到 FROM 关键字”。

我没有正确设置什么?

在 SQL 编辑器任务的 SQL 语句中:

declare @lastRunDate datetime, @lastRunDate_AsString varchar(30), 
        @sqlScript varchar(1000);

set @lastRunDate = (SELECT LastSuccessRunDate 
                    FROM dbo.LastSuccessRunDate 
                    WHERE PackageName = 'V_M_E')

set @lastRunDate_AsString = (SELECT 
                                convert(varchar(20), @lastRunDate, 101) + '
                              ' + substring(convert(varchar(20), @lastRunDate, 9), 13, 5) + substring(convert(varchar(30), @lastRunDate, 9), 25, 2)
currentdate_time)

set @sqlScript = 'SELECT ep.member_id AS MEMBER_ID,  ep.NAME_FIRST AS
                  NAME_FIRST, ep.NAME_LAST AS NAME_LAST, ep.ADDRESS1 AS ADDRESS1, 
                  ep.ADDRESS2 AS ADDRESS2, ep.ZIP AS ZIP, ep.CITY AS CITY, ep.STATE
                  AS STATE, to_date(ep.BIRTH_DATE, ''MM/DD/YYYY'') AS BIRTH_DATE, 
                  ep.GENDER AS GENDER,  '''' AS RACE ,  '''' AS "LANGUAGE",  
                  nc.NAME_FIRST  || '' '' || nc.NAME_LAST AS EMER_CONTACT,  ep.plan AS
                  "LOB", al.affiliation_secondary AS PLAN_DESC, to_date(ep.end_date,
                  ''MM/DD/YYYY'') AS EXP_COVERAGE_DATE, ''RECIPIENT''  AS "TYPE"  
                  FROM
                       scb.ep_view ep,   SCB.N_C NC,  scb.name,  scb.afflib al 
                  WHERE
                       al.affiliation_id = sc_base.name.text3 AND sc_base.name.name_id =
nc.name_id AND nc.name_id  = ep.name_id AND
(to_date(ep.addr_update_date,''mm/dd/yyyy'') > to_date(''' +
@lastRunDate_AsString + ''', ''mm/dd/yyyy hh:miam'') OR
to_date(ep.plan_update_date,''mm/dd/yyyy'') > to_date(''' +
@lastRunDate_AsString + ''', ''mm/dd/yyyy hh:miam'')) UNION SELECT
hf.member_id AS MEMBER_ID,  hf.NAME_FIRST AS NAME_FIRST,  hf.NAME_LAST
AS NAME_LAST,  hf.ADDRESS1 AS ADDRESS1,  hf.ADDRESS2 AS ADDRESS2, 
 hf.ZIP AS ZIP,  hf.CITY AS CITY,  hf.STATE AS STATE,
to_date(hf.BIRTH_DATE, ''MM/DD/YYYY'') AS BIRTH_DATE,  hf.GENDER AS
GENDER,  '''' AS RACE ,  '''' AS "LANGUAGE",   nc.NAME_FIRST  || '' ''
|| nc.NAME_LAST AS EMER_CONTACT,  hf.plan AS "LOB",
al.affiliation_secondary AS PLAN_DESC, TO_DATE(hf.end_date,
''MM/DD/YYYY'') AS EXP_COVERAGE_DATE, ''RECIPIENT''  AS "TYPE" FROM
scb.hf_view hf,   SCB.N_C NC,  scb.name,  scb.afflib al WHERE
al.affiliation_id = sc_base.name.text3 AND sc_base.name.name_id  =
nc.name_id AND nc.name_id  = hf.name_id AND
(to_date(hf.addr_update_date,''mm/dd/yyyy'') > to_date(''' +
 @lastRunDate_AsString + ''', ''mm/dd/yyyy hh:miam'') OR
to_date(hf.plan_update_date,''mm/dd/yyyy'')  >  to_date(''' +
@lastRunDate_AsString + ''', ''mm/dd/yyyy hh:miam''))'

select @sqlScript as SQLSU

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(20 多年前),不鼓励使用它
  • @marc_s 是的,我知道 :) 我一直在使用旧样式,它是自动的。我绝对需要习惯“正确”的方式。感谢您的链接。我会审核的。

标签: sql sql-server oracle ssis


【解决方案1】:

您在动态 sql 中的 Union 中的第二个 sql 中缺少 FROM 子句。

这是因为当您动态创建 sql 语句时,您的文本在 1000 个字符处被截断。

NVARCHAR(MAX)代替VARCHAR(1000)

【讨论】:

  • 谢谢。这就是问题所在。现在我只需要同步元数据列。再次感谢!
【解决方案2】:

使用将超过 1000 个字符的字符串分配给 @sqlScript varchar(1000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多