【问题标题】:SSRS IIF Statement showing #Error when value is non numericSSRS IIF 语句在值为非数字时显示 #Error
【发布时间】:2017-11-21 03:02:14
【问题描述】:

我有一个小数或字符串的值。样本

0.41
0.91
"0 / 2"
0.75

我现在的表达是 =IIF(IsNumeric(Fields!currentRate.Value), Format(CDBL(Fields!currentRate.Value), "P2"), Fields!currentRate.Value)

这会正确返回格式为百分比的小数,但字符串仅显示#Error。我尝试在 IIF 语句中弄乱各种逻辑并改用 Switch。然而,小数总是正确地显示为百分比,而字符串只显示#Error。

是否可以在同一列中同时显示数值和字符串值,同时保持数值的格式?

【问题讨论】:

    标签: sql tsql reporting-services ssrs-2016


    【解决方案1】:

    该错误与CDbl 函数在尝试将作为字符串的列转换为数字时引发异常有关。是的,我知道您首先检查它是否为数字,但 IIF 不是语言结构,它是一个 函数 并且作为一个函数,它会在将其所有参数传递给函数之前对其进行评估。这意味着 True 和 False 参数都会被计算,即使其中一个会被丢弃,并且当它在字符串上计算 CDbl 时会引发错误。

    试试Val 功能。它的好处是在传递非数字数据时不会抛出错误 - 它只是尽其所能将其转换为数字。

    =IIF(IsNumeric(Fields!currentRate.Value), Format(Val(Fields!currentRate.Value), "P2"), Fields!currentRate.Value)
    

    【讨论】:

      【解决方案2】:

      对于任何偶然发现这个问题的人。将我的格式从使用 CDBL 更改为 VAL 可以正常工作。

      【讨论】:

        【解决方案3】:

        IIF() 是 SQL Server 中的一个函数。因此,它返回一个值,其类型由其参数指定。如documentation 中所述:

        返回类型中优先级最高的数据类型 true_value 和 false_value。有关详细信息,请参阅数据类型 优先级 (Transact-SQL)。

        如果两个值之一是数字,则优先。假设两者都是数字。换句话说,SQL 中的表达式只为所有行返回一种类型。

        【讨论】:

        • 有没有办法在一个列中正确混合数字/字符串并保持格式化数字的能力?或者这绝对不可能?
        • @gordon-linoff OP 指的是 Reporting Services 函数(我认为它们是 VB.net 函数)上下文中的 iif() 函数,而不是 SQL Server t-sql 标量函数。 SSRS 函数在 rdl 本身中使用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多