2

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

“强制转换规范的字符值无效”

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

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

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

4

3 回答 3

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")
于 2018-01-09T19:17:02.633 回答
1

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

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

或者

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

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

于 2018-01-09T19:18:51.160 回答
0

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

所以...

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

编辑 - replacenull 然后应用转换:

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 是占位符。

于 2018-01-09T17:50:39.290 回答