【问题标题】:Importing yyyyMMdd Dates From CSV in SSIS在 SSIS 中从 CSV 导入 yyyyMMdd 日期
【发布时间】:2017-09-14 17:19:42
【问题描述】:

我有 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。目标字段在 SQL Server 中采用 DATE 格式。 SSIS 总是显示“由于可能丢失数据而无法转换”错误。我检查了 CSV 中的原始数据,没有看到任何不合适的日期。一切都符合格式。

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

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

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

【问题讨论】:

  • 我想知道它是否将字段解释为整数。这可能解释了数据丢失警告以及在对字段使用字符串操作之前需要转换字段。
  • 你能发布你的 csv 的 sn-p,只有几行吗?
  • 转换错误特别提到 Substring 不适用于 DT_DBDATE。
  • @grichmer 尝试投射到DT_DATE .. 看看我的回答并给出反馈

标签: sql-server csv ssis etl derived-column


【解决方案1】:

您在 Connection Manager 中将列 [Date_Column] 设置为 DT_STR。你指定的长度是多少?默认为 50。在 Derived Column 中,您使用它的长度为 10,这是错误消息“由于可能丢失数据而无法转换”。

【讨论】:

  • 你叫它。我设置了长度为 8 的日期字段。我将其更改为 10 并重建了数据流任务。现在它起作用了!感谢您的帮助!
【解决方案2】:

尝试转换为 (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标记为输入列,添加一个新的输出列outColumn,数据类型为DT_DBTIMESTAMP

将脚本语言更改为 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

【讨论】:

  • 双击脚本组件。并转到脚本选项卡。然后点击设计脚本按钮。它将打开一个 vs 编辑器
  • 它是 dt_date 而不是 db_date
  • 我尝试使用 DT_DATE 代替,但我得到了同样的错误。至于您评论的第二部分,我正在尝试,但脚本组件对我来说是一个新组件。我是否需要在每个日期字段中输入该行代码一次?
  • 如果所有人都有同样的问题,是的。
  • 我收到几个语义错误,说 1) 我需要定义列名和 2) DateTimeNew System.Globalization.CultureInfo 在当前上下文中不存在。
猜你喜欢
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 2016-11-03
  • 2016-12-09
  • 1970-01-01
  • 2013-03-13
相关资源
最近更新 更多