在派生列中嵌套 IF ELSE

Nested IF ELSE in a derived column

我有以下逻辑将日期存储在 BI_StartDate 中,如下所示:

我正在使用派生列,如下所示:

ISNULL(UpdatedDateODS)  ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :
(ISNULL(CreatedDateODS) ? GETDATE()  ))

我收到此错误:

The expression "ISNULL(UpdatedDateODS) ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :(ISNULL(CreatedDateODS) ? GETDATE() ))" on "Derived Column.Outputs[Derived Column Output].Columns[Derived Column 1]" is not valid.

您正在查找第一个非空值,它是 SSIS 数据流(派生列)中不存在的合并。

我建议一个非常简单的脚本组件:

Row.BIStartDate = Row.UpdateDate ?? Row.EntryDate ?? Row.CreatedDate ?? DateTime.Now;

这是输入列屏幕:

这是输入和输出:

然后将以上代码添加到行处理部分:

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        /*
         * Add your code here
         */

        Row.BIStartDate = Row.UpdateDate ?? Row.EntryDate ?? Row.CreatedDate ?? DateTime.Now;
}

语法的角度来看,嵌套的if-else条件写得不好,因为你必须确保所有可能的输出都应该有相同的数据类型,你也没有'提到最后一个"else"条件:

ISNULL(UpdatedDateODS)  ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :
(ISNULL(CreatedDateODS) ? GETDATE() : **<missing>** ))

逻辑角度,如果ISNULL(UpdatedDateODS)为真,你的表达式可能会抛出异常,因为你正在使用EntryDateODS列,而你应该检查EntryDateODS在使用之前不为null,我建议表达式如下:

ISNULL(UpdatedDateODS)  ? UpdatedDateODS : (ISNULL(EntryDateODS) ? EntryDateODS :
(ISNULL(CreatedDateODS) ? CreatedDateODS : GETDATE()  ))

如上所述,如果 UpdatedDateODS , EntryDateODS, CreatedDateODSGETDATE() 没有相同的数据类型 那么你应该转换为统一的数据类型,例如:

ISNULL(UpdatedDateODS)  ? (DT_DATE)UpdatedDateODS : (ISNULL(EntryDateODS) ? (DT_DATE)EntryDateODS :
(ISNULL(CreatedDateODS) ? (DT_DATE)CreatedDateODS : (DT_DATE)GETDATE()  ))