6

我想将值“5/27/2013 16:42:37.490000”(从平面文件(DT_STR)读取)插入 SQL Server 表的列(日期时间)。如果我尝试在派生列中使用 (DT_DBDATE) 或 DT_DBTIMESTAMP 对其进行强制转换,则会出现错误。

[Derived Column [130]] Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR.  The "component "Derived Column" (130)" failed because error code 0xC0049064 occurred, and the error row disposition on "output column "Derived Column 1" (155)" specifies failure on error. An error occurred on the specified object of the specified component.  There may be error messages posted before this with more information about the failure.

我该怎么办?

谢谢

4

2 回答 2

9

该值是一个datetime2类型。AFAIK SSIS 不支持 datetime2 。您需要将其作为字符串存储在数据库中,然后通过将其转换为 datetime2 来更新列。

这是Microsoft Connect 问题

更新:使用DT_DBTIMESTAMP2您可以将字符串转换为正确的日期时间格式

下面的代码在派生列中工作得很好

(DT_DBTIMESTAMP2,7)"2013-5-27 16:42:37.490000"

7是这里的岁差。如果日期时间的格式不同,上面的代码将不起作用。例如 MM/DD/YYYY HH:mm:ss.ffffff

但是,您可以使用Script component和传递不同日期时间格式的数组来Datetime.ParseExact运行

Step1:拖拽一个脚本组件,新建一个DT_DBTIMESTAMP数据类型的输出列,命名为NewDate.

Step2:编写以下C#代码

public override void Input0_ProcessInputRow(Input0Buffer Row)
 {
  string[] format = new string[] { @"M/dd/yyyy HH:mm:ss.ffffff",
                                         @"MM/dd/yyyy HH:mm:ss",
                                         @"M/d/yyyy HH:mm:ss" ,
                                         @"M/dd/yyyy HH:mm:ss.ffffff",
                                         @"MM/dd/yyyy HH:mm:ss.ffffff",
                                          @"M/d/yyyy HH:mm:ss.ffffff"};
  DateTime dt = DateTime.ParseExact(Row.Date,
                format ,
                CultureInfo.InvariantCulture,
                DateTimeStyles.None);

  Row.newDate = dt;
 }
于 2013-05-29T12:42:36.157 回答
1

我不会说这是完美的解决方案,而只是一种解决方法。格式化输入,然后插入。使用以下表达式后的格式化数据适用于 datetime 或 datetime2。

SUBSTRING(TMS_CREAT,(FINDSTRING(TMS_CREAT,"/",2) + 1),4) + "-" + SUBSTRING(TMS_CREAT,1,(FINDSTRING(TMS_CREAT,"/",1) - 1)) + "-" + SUBSTRING(TMS_CREAT,(FINDSTRING(TMS_CREAT,"/",1) + 1),2) + SUBSTRING(TMS_CREAT,(FINDSTRING(TMS_CREAT,"/",2) + 5),16)
于 2013-05-30T09:38:39.913 回答