在DAX中,拦截错误的函数是IFERROR,,它很简单也很好用,需要注意处理错误的函数可能会在代码中造成严重的性能问题。这并不是因为它们本身缓慢。问题主要是在于发生错误时,DAX 引擎无法在其代码中使用优化的路径。在大多数情况下,检查运算对象比检查错误(使用错误处理引擎)更有效。
例如,不要这样写:
IFERROR (
SQRT ( Test[Omega] ),
BLANK ()
)
如下的写法是更好的:
IF (
Test[Omega] >= 0,
SQRT ( Test[Omega] ),
BLANK ()
)
第二个表达式不需要检测错误,并且比前一个表达式更快。
避免 IFERROR 的另一个原因是,它无法拦截在更深层次的执行中所发生的错误。例如,以下代码拦截在 Table[Amount] 列的转换中发生的任何错误,用空白值来防止 Table [Amount] 列发生不包含数字的状况。正如前面讨论的,这样的执行代价很高,因为它对表中的每一行都进行了计算。
SUMX (
Table,
IFERROR ( VALUE ( Table[Amount] ), BLANK () )
)
请注意,由于在 DAX 引擎中进行了优化,下面的代码不会拦截前面示例截获的相同错误。如果 Table[Amount] 列在某一行中包含了不是数字的字符串,则整个表达式会生成一个不是被 IFERROR 拦截的错误。
IFERROR (
SUMX (
Table,
VALUE ( Table[Amount] )
),
BLANK ()
)
ISERROR 与 IFERROR 具有相同的行为。请务必谨慎使用它们,并且只拦截由 IFERROR / ISERROR 中 计算的表达式直接引起的错误,而不用于嵌套计算。
《DAX圣经》学习笔记
采悟 @ Power BI星球
网友评论