SSIS 条件拆分错误 - 表达式计算结果为 NULL,但“条件拆分”需要布尔结果

问题描述 投票:0回答:2

这是我第一次使用这个软件。我正在尝试拆分该值,但它显示了这一点,当我看到源时,我没有任何 null 值,但当我预览它时,它在前 200 列中显示 null 值,但我只有 15 列。

错误:数据流任务中的 0xC020902B,条件拆分 [2]:“条件拆分.输出 [情况 1]”上的表达式“[RATE_INR 的副本] > 1000”计算结果为 NULL,但“条件拆分”需要布尔值结果。修改输出上的错误行配置,将此结果视为 False(忽略失败)或将此行重定向到错误输出(重定向行)。对于条件拆分,表达式结果必须是布尔值。 NULL 表达式结果是一个错误。

sql-server ssis etl conditional-split
2个回答
3
投票

您在条件拆分组件中使用以下表达式:

[Copy of RATE_INR] > 1000

如错误消息中所述,该表达式被计算为

NULL
,它会抛出异常,因为条件分割组件需要布尔结果(True/False)。

您可以使用 REPLACENULL 函数来解决这个问题:

REPLACENULL([Copy of RATE_INR],0) > 1000

或者

REPLACENULL([Copy of RATE_INR] > 1000, False)

0
投票

我想仅修复条件分割是不好的,因为

[Copy of RATE_INR]
不应该将其视为空。

在我的数据流中,我在条件分割的

MyColumnForUnpivoting ==  TRUE
处遇到了同样的错误:

[MyColumnForUnpivoting007 [871]] 错误:“MyColumnForUnpivoting007.Outputs[Fehler]”上的表达式“MyColumnForUnpivoting == TRUE”计算结果为 NULL,但“MyColumnForUnpivoting007”需要布尔结果。修改输出上的错误行配置,将此结果视为 False(忽略失败)或将此行重定向到错误输出(重定向行)。对于条件拆分,表达式结果必须是布尔值。 NULL 表达式结果是一个错误。

我一开始改成:

ISNULL(MyColumnForUnpivoting) ?  FALSE  : MyColumnForUnpivoting ==  TRUE 

然后我找到了这个 Q/A 并将条件分割更改为:

REPLACENULL(MyColumnForUnpivoting, FALSE ) ==  TRUE 

这会缩短一点,但结果相同。然而,我改变了主意并检查了“MyColumn”的 NULL 来自哪里:

派生列具有代码:

FINDSTRING(Vorname,"#",1) > 0 || FINDSTRING(Nachname,"#",1) > 0 || FINDSTRING(Geburtsname,"#",1) > 0 || FINDSTRING(Geburtsort,"#",1) > 0 || FINDSTRING(Strasse,"#",1) > 0 || FINDSTRING(Adresszusatz,"#",1) > 0 || FINDSTRING(Ort,"#",1) > 0

这里发生的情况是,一旦“OR”链接列检查之一返回 NULL(即,如果其中一个字段为 NULL),则整个表达式将变为 NULL。这不是这里的目的,此代码检查地址字段中的某处是否有“#”,并且仅一个字段中的 NULL 将主导任何发现。

我将表达方式改为:

FINDSTRING(REPLACENULL(Vorname,""),"#",1) > 0 || FINDSTRING(REPLACENULL(Nachname,""),"#",1) > 0 || FINDSTRING(REPLACENULL(Geburtsname,""),"#",1) > 0 || FINDSTRING(REPLACENULL(Geburtsort,""),"#",1) > 0 || FINDSTRING(REPLACENULL(Strasse,""),"#",1) > 0 || FINDSTRING(REPLACENULL(Adresszusatz,""),"#",1) > 0 || FINDSTRING(REPLACENULL(Ort,""),"#",1) > 0

并将条件拆分更改回

MyColumnForUnpivoting ==  TRUE
,并且数据流在不丢失所需的“#”行的情况下运行。

© www.soinside.com 2019 - 2024. All rights reserved.