2

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

  • 如果UpdatedDate不为空,则BI_StartDate=UpddatedDate
  • ELSEBI_StartDate取值EntryDate,如果EntryDate为 null 则BI_StartDate=CreatedDate
  • 如果CreatedDateIS NULL 则BI_StartDate=GetDATE()

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

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

我收到此错误:

表达式“ISNULL(UpdatedDateODS) ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :(ISNULL(CreatedDateODS) ? GETDATE() ))”在“Derived Column.Outputs[Derived Column Output].Columns[Derived Column 1]”是无效。

4

2 回答 2

2

您正在寻找第一个非空值,它是 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;
}
于 2020-02-19T19:52:27.287 回答
1

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

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

逻辑的角度来看,表达式可能会抛出异常,因为您使用的是EntryDateODS列 ifISNULL(UpdatedDateODS)为 true,而您应该EntryDateODS在使用它之前检查 if is not null,我建议表达式如下:

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

如上所述,如果UpdatedDateODSEntryDateODS不具有相同的数据类型CreatedDateODS,那么您应该转换为统一的数据类型,例如:GETDATE()

ISNULL(UpdatedDateODS)  ? (DT_DATE)UpdatedDateODS : (ISNULL(EntryDateODS) ? (DT_DATE)EntryDateODS :
(ISNULL(CreatedDateODS) ? (DT_DATE)CreatedDateODS : (DT_DATE)GETDATE()  ))
于 2020-02-20T09:56:33.417 回答