【问题标题】:Date column populating from CSV to table behaving differently using SSIS使用 SSIS 将日期列从 CSV 填充到表现不同的表
【发布时间】:2017-09-18 16:23:53
【问题描述】:

我有 CSV 文件

**date column**
06/04/1999
06/04/2000
.
.
.06/04/2017

我只是使用 SSIS 将此文件从 Csv 文件加载到数据库表中

平面文件源到 OLEDB 目标

其中日期列绝对是 DT_STR 而 SQL 表日期列是 varchar(50)

但是当我加载时它的行为会有所不同,有时它会像这样填充

  **date column**
    06/04/1999
    06/04/2000

还有一些其他时间,比如

 **date column**
    1999-04-06
    2000-04-06

我只是想加载与平面文件中相同的内容,但为什么有时会给出“-”。 谁能建议我为什么每次都表现不同。 它在 SSIS 中没有任何转换(如派生列)

【问题讨论】:

  • source后面metadata的数据类型是什么?第一个更像是在VARCHAR 中输入您的目标,但对于第二次加载,它更像是列是DATE 格式
  • 没有元数据与第一次加载相同@LONG
  • 您是否确认文件中的日期始终采用相同的格式,或者这些日期有时采用一种格式,有时采用另一种格式?由于您只是将数据作为字符串导入,因此了解这一点很重要。
  • 如果我看到文件看起来与 DD/MM/YYYY 相同的日期格式,我如何验证文件中的日期
  • @mohan111 它可能包含一些不同格式的行,如果两列都是varchar并且在数据导入过程中没有转换,那么问题肯定在平面文件中。看看我提供的答案,然后给我答复

标签: sql sql-server ssis etl


【解决方案1】:

您必须使用 ScriptComponent Transformation 将这些值转换为 DateTime,然后转换为具有所需格式 yyyy-MM-dd 的字符串

  1. 创建一个Flat File connection manager 和一个OLEDB Connection Manager(源和目标)
  2. 添加DataFlow Task
  3. DataFlow Task 中添加Flat File SourceScript ComponentOLEDB Destination
  4. 你的数据流应该看起来像Source --> Script --> Destination
  5. 在脚本组件中将时间列标记为输入(假设它的名称为inDateColumn)并添加字符串DT_STR 的输出列(例如:OutDateColumn
  6. 在脚本中编写以下代码:(使用 Vb.net)

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)  
    
        If Not Row.inDateColumn_IsNull AndAlso _
            Not String.IsNullOrEmpty(Row.inDateColumn.Trim) Then
    
            ' You can add more formats inside the following method
    
            Row.OutDateColumn = DateTime.ParseExact(Row.inDateColumn.Trim,New String(){"yyyy-MM-dd","dd/MM/yyyy"},New System.Globalization.CultureInfo("En-GB"), System.Globalization.DateTimeStyles.None).ToString("yyyy-MM-dd")
    
        Else
    
            Row.OutDateColumn_IsNull = True
    
        End If
    
    End Sub 
    
  7. OutDateColumn映射到目标列

【讨论】:

  • 我为什么要使用脚本任务。我如何才能在文件本身中保持数据完整性。你能解释一下需要采取的步骤
  • @mohan111 我说的是脚本组件转换,它是一个数据流任务组件,而不是脚本任务。
  • 脚本组件包含一个名为 ProcessInputRow 的子组件,它将在数据流任务docs.microsoft.com/en-us/sql/integration-services/…的每一行上运行
  • 在我的回答中,我使用了DateTime.ParseExact,它将字符串值转换为基于格式数组的日期时间。然后我使用ToString("yyyy-MM-dd") 将日期值转换为具有上述格式的日期字符串。所以所有值在输出中都将具有相同的格式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多