在SSIS派生列中替换NULL

时间:2018-01-09 17:38:46

标签: sql sql-server ssis etl derived-column

我有一个SSIS包,可以将数据从SAS传输到SQL Server。我创建了一个派生列但无法使REPLACENULL功能正常工作。我收到错误

  

"投射规范的字符值无效"

我确定是因为源中的NULL值。这是我当前的派生列表达式:

REPLACENULL(DATEADD("d",(DT_I8)AuthEndDate,(DT_DATE)"1960-01-01"),0)

REPLACENULL功能在这里工作。有什么方法可以做到这一点?我正在使用SSIS 2008.谢谢。

3 个答案:

答案 0 :(得分:1)

由于您希望空白/ 0向下游流动,因此您需要if,而不是replacenull()

请注意SQL Server中的空白/ 0写为1900-01-01,空白/ 0不是有效日期值,因此默认为此。唯一的另一个选择是NULL。

如果目的地是日期时间列,这应该有效:

ISNULL(AuthEndDate) ? (DT_DATE)0 : DATEADD("d",(DT_I8)AuthEndDate,(DT_DATE)"1960-01-01")

如果您选择写入NULL而不是1900-01-01,则可以执行以下操作:

ISNULL(AuthEndDate) ? NULL(DT_DATE) : DATEADD("d",(DT_I8)AuthEndDate,(DT_DATE)"1960-01-01")

答案 1 :(得分:1)

您必须使用以下表达式之一:

DATEADD("d",(DT_I8)REPLACENULL([AuthEndDate],0),(DT_DATE)"1960-01-01")

OR

ISNULL([AuthEndDate]) ? (DT_DATE)"1960-01-01" : DATEADD("d",(DT_I8)AuthEndDate,(DT_DATE)"1960-01-01")

请注意,您不能使用可返回多种数据类型的逻辑,两种情况都必须返回数据类型(DT_DATE

答案 2 :(得分:0)

如果源返回NULL,则在AuthEndDate而不是在计算之后尝试REPLACENULL。您所拥有的语句将尝试使用NULL进行计算,这绝不是好事。

因此...

REPLACENULL(DATEADD("d",REPLACENULL((DT_I8)AuthEndDate,0),(DT_DATE)"1960-01-01"),0)

修改 - 替换然后应用转换:

DATEADD("d",(DT_I8)REPLACENULL(AuthEndDate,0),(DT_DATE)"1960-01-01")

您不再需要第一个REPLACENULL,因为我们现在在计算之前处理它。

因此:

DATEADD("d",REPLACENULL((DT_I8)AuthEndDate,0),(DT_DATE)"1960-01-01")

编辑:您可以将0更改为您想要NULL的任何内容,0是占位符。