Sql server 在派生列中嵌套IF-ELSE
我使用以下逻辑将日期存储在BIU StartDate中,如下所示:Sql server 在派生列中嵌套IF-ELSE,sql-server,ssis,expression,etl,derived-column,Sql Server,Ssis,Expression,Etl,Derived Column,我使用以下逻辑将日期存储在BIU StartDate中,如下所示: 如果updateDate不为空,则BI\u StartDate=UpddatedDate 如果EntryDate为空,则ELSEBI_StartDate接受EntryDate值 然后biu StartDate=CreatedDate 如果CreatedDate为空,则BI\u StartDate=GetDATE() 我使用的是派生列,如下所示: ISNULL(UpdatedDateODS) ? EntryDateODS :
- 如果
不为空,则updateDate
BI\u StartDate=UpddatedDate
- 如果
为空,则ELSEEntryDate
接受BI_StartDate
值 然后EntryDate
biu StartDate=CreatedDate
- 如果
为空,则CreatedDate
BI\u StartDate=GetDATE()
ISNULL(UpdatedDateODS) ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :
(ISNULL(CreatedDateODS) ? GETDATE() ))
我得到这个错误:
表达式“ISNULL(UpdateDateOds)?EntryDateODS:
(ISNULL(EntryDateODS)?CreatedDataOds:(ISNULL(CreatedDataOds)?
GETDATE())“on”派生列。输出[派生列
输出].Columns[派生列1]”无效
您正在查找第一个非空值,它是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>** ))
如上所述,如果UpdatedDateODS
、EntryDateODS
、CreatedDateODS
和GETDATE()
没有相同的数据类型,则应转换为统一的数据类型,例如:
ISNULL(UpdatedDateODS) ? (DT_DATE)UpdatedDateODS : (ISNULL(EntryDateODS) ? (DT_DATE)EntryDateODS :
(ISNULL(CreatedDateODS) ? (DT_DATE)CreatedDateODS : (DT_DATE)GETDATE() ))
我如何使用脚本组件实现它?如果您等待大约10分钟,我将有屏幕截图。我将提前等待谢谢您。你能解释一下为什么不能使用派生列吗?如果你还没有写完答案,你就不应该把它贴出来/@答案是一样的。现在有关于如何做的截图。
biu StartDate
是否表示“干预日期”?
ISNULL(UpdatedDateODS) ? (DT_DATE)UpdatedDateODS : (ISNULL(EntryDateODS) ? (DT_DATE)EntryDateODS :
(ISNULL(CreatedDateODS) ? (DT_DATE)CreatedDateODS : (DT_DATE)GETDATE() ))