我有一个SSIS包,可以将数据从SAS传输到SQL Server。我创建了一个派生列但无法使REPLACENULL
功能正常工作。我收到错误
"投射规范的字符值无效"
我确定是因为源中的NULL值。这是我当前的派生列表达式:
REPLACENULL(DATEADD("d",(DT_I8)AuthEndDate,(DT_DATE)"1960-01-01"),0)
REPLACENULL
功能在这里工作。有什么方法可以做到这一点?我正在使用SSIS 2008.谢谢。
答案 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是占位符。