从 SSIS 中的 CSV 导入 yyyyMMdd 日期

Importing yyyyMMdd Dates From CSV in SSIS

我有 12 列使用 yyyymmdd 格式。在数据流任务中,我有一个平面文件源、一个派生列任务和一个OLE DB 目标。我将以下表达式应用于 派生列任务 中的这些字段:

(DT_DBDATE)(SUBSTRING((DT_STR,10,1252)([Date_Column]),1,4) + "-"
+ SUBSTRING((DT_STR,10,1252)([Date_Column]),5,2) + "-"
+ SUBSTRING((DT_STR,10,1252)([Date_Column]),7,2))

它一直让我在对它进行子字符串化之前转换该字段,但是我在 Connection Manager[ 中将这些字段设置为 DT_STR =41=]。目标字段在 SQL 服务器中采用 DATE 格式。 SSIS 总是显示 "could not be converted because of a potential loss of data" 错误。我检查了 CSV 中的原始数据,没有看到任何看起来不合适的日期。一切都符合格式。

我也曾尝试按照 here 的建议使用 数据转换 任务,但最终遇到了同样的错误。有什么建议吗?我在这里看到的答案都指向使用 Derived Column 任务,但我提到的其他几个人也遇到了同样的问题。

编辑:这是数据示例。所有错误中特别提到的字段是 CRTFCTN_DT。数据集中有 470 个字段,但这确实显示了前两个日期字段。

解决方案: 连接管理器 中,我将 yyyymmdd 字段更改为 DT_STR(10)(8 个字符表示日期,2 个字符表示添加的破折号),并重建了我的 数据流任务 。这解决了问题。如果您不重建任务,Derived Column 任务将不会选择新的数据类型。重新创建任务后,我也不再需要在应用子字符串之前将日期转换为字符串。

尝试转换为 (DT_DATE) 而不是 DT_DBDATE

(DT_DATE)((SUBSTRING((DT_STR,50,1252)([Date_Column]),1,4) + "-"
+ SUBSTRING((DT_STR,50,1252)([Date_Column]),5,2) + "-"
+ SUBSTRING((DT_STR,50,1252)([Date_Column]),7,2)))

您可以执行此解决方法

假设日期列名是inColumn

在 DataflowTask 中,添加脚本组件,将 inColumn 标记为输入列,添加数据类型为 DT_DBTIMESTAMP

的新输出列 outColumn

将脚本语言更改为 vb.net

将您的日期列标记为输入

为每个日期列创建一个输出列

在脚本中,在Input0_ProcessInputRow子中使用DateTime.ParseExact函数如下:

在此示例中,日期列为 MailReceivingDate

Public Class ScriptMain
    Inherits UserComponent


    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

        If Not Row.MailReceivingDate_IsNull AndAlso
              Not String.IsNullOrEmpty(Row.MailReceivingDate.Trim) Then

            Row.outColumn = DateTime.ParseExact(Row.MailReceivingDate.Trim, "yyyyMMdd", New System.Globalization.CultureInfo("en-GB"))

        Else

            Row.outColumn_IsNull = True

        End If

    End Sub

End Class

您在连接管理器中将列 [Date_Column] 设置为 DT_STR。你指定的长度是多少?默认情况下它是 50。在派生列中,您使用它的长度为 10,这是错误消息 "could not be converted because of a potential loss of data".