SSIS:在SOQL查询中转换SSMS验证表的数据类型

时间:2019-04-17 18:41:40

标签: validation ssis type-conversion cdata soql

我正在研究使用SSIS引入SalesForce表的EDW。我正在CData Salesforce Source上编写一个验证查询,该查询将返回CURRENT_DATEIME()的加载时间以及Column值的总和,以便稍后在验证策略中使用。我将这些列的结果导入到SSMS中的源验证表中。我遇到的问题是,当我都需要NUMERIC时,CData会将列默认设置为STRING数据类型,但是显然您无法在SOQL查询中解析,转换或强制转换。转换它们的最佳方法是什么?

到目前为止,这是我的查询.....

SELECT TABLE_NAME, SOURCE_COLUMN_VALUE, COLUMN_NUMBER, LOAD_DATE, LOAD_DATETIME 
FROM (
      SELECT 'TABLE' AS TABLE_NAME, COUNT(*) AS SOURCE_COLUMN_VALUE, 0 AS 
      COLUMN_NUMBER, CURRENT_DATE() AS LOAD_DATE, CURRENT_TIMESTAMP() AS 
      LOAD_DATETIME  
      FROM [TABLE] UNION ALL

      SELECT 'TABLE' AS TABLE_NAME, SUM(CASE WHEN Id IS NULL THEN 0 ELSE 1 
      END) AS SOURCE_COLUMN_VALUE,  1 AS COLUMN_NUMBER, CURRENT_DATE() AS 
      LOAD_DATE,CURRENT_TIMESTAMP() AS LOAD_DATETIME FROM [TABLE]
)

我需要使用SOQL将选定的列SOURCE_COLUMN_VALUE和LOAD_DATETIME转换为NUMERIC。

我已经尝试过TO_NUMBER()和NUMERIC.PARSE()

这是我不断收到的错误

  

错误:BASS_USER_VALIDATION处的OLE DB目标为0xC020901C [29]:OLE DB Destination.Inputs输入[OLE DB目标输入]。OLEDB Destination.Inputs列[LOAD_DATE]。输入[OLE DB目标输入]。返回的列状态为:“由于潜在的数据丢失,无法转换该值。”

     

错误:BASS_USER_VALIDATION处的OLE DB目标[29]错误:0xC0209029:SSIS错误代码DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “ OLE DB Destination.Inputs [OLE DB目标输入]”失败,因为发生了错误代码0xC0209077,并且“ OLE DB Destination.Inputs [OLE DB目标输入]”上的错误行配置指定了错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

     

错误:SSIS BASS_USER_VALIDATION处的错误:0xC0047022。管道:SSIS错误代码DTS_E_PROCESSINPUTFAILED。处理输入“ OLE DB目标输入”(42)时,组件“ OLE DB目标”(29)上的ProcessInput方法失败,错误代码为0xC0209029。所标识的组件从ProcessInput方法返回了错误。该错误是特定于组件的,但该错误是致命的,将导致“数据流”任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

1 个答案:

答案 0 :(得分:1)

我们最终使用派生列解决了该问题,在该列中,我们可以获取日期时间的字符串,将其解析为所需的字符串,然后将其转换为数字类型。我不确定这不是最有效的方法,但是它正在做需要做的事情! (SalesForce桌子将成为我的死亡)

(DT_NUMERIC,12,4)(DT_DATE)(SUBSTRING(LOAD_DATETIME,1,4) + "-" + SUBSTRING(LOAD_DATETIME,FINDSTRING(LOAD_DATETIME,"-",1) + 1,2) + "-" + SUBSTRING(LOAD_DATETIME,FINDSTRING(LOAD_DATETIME,"-",2) + 1,2) + " " + SUBSTRING(LOAD_DATETIME,FINDSTRING(LOAD_DATETIME,"T",1) + 1,2) + ":" + SUBSTRING(LOAD_DATETIME,FINDSTRING(LOAD_DATETIME,":",1) + 1,2))

enter image description here