SSIS派生列日期格式

时间:2017-03-30 10:17:41

标签: sql-server xml ssis

我有一个大型数据文件,我正在通过SSIS运行。非常简单public void addAorB(A item){ //add to SetA a.add(item); } public void addAorB(B item){ //add to SetB b.add(item); } XML source。我很少使用SSIS,所以我远非专家。

我有一些记录,我推入错误表,因为日期不正确。

我想说的是,如果日期不是日期格式,请将此SQL database更新为date

我不知道NULL是否可行,但似乎应该给出我在网上阅读的例子。

我想在SSIS阶段修复此问题,而不是在数据加载到错误表后的SQL中。

3 个答案:

答案 0 :(得分:1)

最好使用script component而不是使用derived column来实现此目标,因为Scripts包含更多操作日期的选项。

如果要检查特定日期格式,可以使用DateTime.TryParseExact()方法,或使用DateTime.TryParse()尝试根据CultureInfo日期格式解析日期。

首先,您必须添加Script component,将日期列标记为输入,创建类型为DT_DBTIMESTAMP的新输出列

我将举两个例子: 假设输入列名称为inDate且输出列为outDate

DateTime.TryParseExact()

Dim strFormats() As String = {"dd/MM/yyyy HH:mm:ss", "yyyy-MM-dd HH:mm:ss", "yyyyMMdd HH:mm:ss", "dd-MMM-yyyy HH:mm:ss", "MM/dd/yyyy HH:mm:ss"}

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)



    If Not Row.inDate_IsNull AndAlso
                 Not String.IsNullOrEmpty(Row.inDate) Then


        Dim dtTemp As DateTime

        If DateTime.TryParseExact(Row.inDate, strFormats, System.Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, dtTemp) Then

            Row.outDate = dtTemp

        Else

            Row.outDate_IsNull = True

        End If



    End If
End Sub

DateTime.TryParse()

 Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)



    If Not Row.inDate_IsNull AndAlso
                 Not String.IsNullOrEmpty(Row.inDate) Then


        Dim dtTemp As DateTime

        If DateTime.TryParse(Row.inDate, System.Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, dtTemp) Then

            Row.outDate = dtTemp

        Else

            Row.outDate_IsNull = True

        End If



    End If
End Sub

您可以在此帖子中阅读有关使用SSIS脚本组件的日期时间转换的更多信息:

答案 1 :(得分:0)

您需要配置无法从文本转换为日期的组件的错误输出。

通常是 section{ width:100%; height:100vh; background-color: rgba(236, 240, 241,1.0); } div.container{ display: inline-block; width:150px; height:150px; margin:10px; background-color: rgba(189, 195, 199,1.0); border-radius: 5px; } div.container:first-child{ margin-left: 20px; } div.container .load_1{ width:20px; height:20px; display: inline-block; background-color: rgba(52, 152, 219,1.0); } Data Conversion组件。 如果您已经从源接收日期格式的列 - 它是您的Derived Column组件。

  • 1a上。双击您XML SourceData Conversion组件,然后转到Derived Column

  • 1b中。双击Configure Error Output,转到XML Source

    1. 对于您的日期列,将默认Error OutputError选项更改为忽略失败

无法转换的值现在将包含NULL。

JSfiddle.

答案 2 :(得分:0)

SSIS表达式在日期和错误处理方面受到限制。相反,我建议使用脚本组件。

  • 在输入列下,选择要使用的列。在下面的示例中,我的列名为" date"
  • 将以下内容添加到脚本中:

    using System.Globalization;
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
        DateTime dateResult;
        if (!DateTime.TryParse(Row.date, culture, DateTimeStyles.None, out dateResult))
        {
            Row.date = null;
        }
    }
    

日期列是一个字符串,在插入数据库之前,可以使用数据转换组件将其转换为Datetime。 文化被设置为美国英语,但这可以根据您的具体需求进行更改。该提示将接受本地时间格式,即MM / dd / yyyy。

如果TryParse()能够从输入字符串成功解析日期,则返回true。当它返回false时,我们只需将列设置为null。