SQL -VB - 即使if为真,它还会评估else吗?

Chr*_*sCa 5 sql sql-server-2005 reporting-services

我试图阻止#error显示在我正在创建的报告中

当我划分2个数字并且其中一个为零时,会发生这种情况

所以我尝试使用if/switch语句在进行除法之前检查2号中的任何一个是否为0:

    =IIf(Fields!Field1.Value = 0 
            or Fields!Field2.Value = 0 
            or Not(IsNumeric(Fields!Field1.Value)) 
            or Not(IsNumeric(Fields!Field2.Value)), 
        0, 
        (Fields!Field1.Value/Fields!Field2.Value)*100
    )


    =Switch(
            Fields!Field1.Value = 0 or Fields!Fields.Value = 0, 0,
            IsNumeric(Fields!Field1.Value) or IsNumeric(Fields!Fields.Value), (Fields!Field1.Value/Fields!Fields.Value)*100
    )
Run Code Online (Sandbox Code Playgroud)

这两个仍然抛出错误.即使if语句为true,似乎仍然会评估else条件

如果我将代码更改为仅为if和else打印X或Y,那么它可以工作 - 所以if语句中没有错误

这个sems对我来说很荒谬

请告诉我,我做错了什么?当if为真时,我无法相信该语言会评估其他语言

编辑

所以似乎评估了else条件.那么你如何绕过零误差的潜在鸿沟呢?

以下是答案:http: //www.sqlservercentral.com/Forums/Topic442497-150-1.aspx#bm1115960

另一种选择(特别是如果你有一个包含许多表达式的报告可能会导致零除的情况)是使用自定义代码功能.

在"报告属性"的"代码"选项卡/窗口中,输入以下内容:

Public Function DivideBy(ByVal Exp1, ByVal Exp2)
If Exp2 = 0 Then
DivideBy = 0
Else : DivideBy = Exp1 / Exp2
End If
End Function
Run Code Online (Sandbox Code Playgroud)

然后将表达式= code.DivideBy(Field!ToBeDivided.Value,Field!DividingBy.Value)插入任何有可能被零除问题的单元格中.

Jay*_*ymz 7

是的,评估IIf函数的真假部分:

http://en.wikipedia.org/wiki/IIf#Side_Effects

副作用
IIf的另一个问题是因为它是一个库函数:与C派生的条件运算符不同,无论实际返回哪一个,都将评估truepart和falsepart.请考虑以下示例:

value = 10 
result = IIf(value = 10, TrueFunction, FalseFunction)
Run Code Online (Sandbox Code Playgroud)

虽然TrueFunction是要调用的函数,但IIf将导致执行TrueFunction和FalseFunction.

还要考虑这个:

a = 10 
b = 0 
result = IIf(b <> 0, a / b, 0) 
Run Code Online (Sandbox Code Playgroud)

虽然程序员打算通过执行除零来避免引发错误,但只要b为零,错误就会实际发生.这是因为代码段中的代码将被读取为

a = 10 b = 0
_temp1 = a / b ' Error if b = 0
_temp2 = 0
_temp3 = b <> 0 result = IIf(_temp3, _temp1 , _temp2) 
Run Code Online (Sandbox Code Playgroud)

这个问题使得IIf()调用没有条件运算符那么有用.为了解决这个问题,微软开发人员考虑将IIf转换为内在函数; 如果发生这种情况,编译器就能够通过用内联代码替换函数调用来执行类型推断和短路.


Yuc*_*uck 6

这两个Iif()Switch()是函数调用,因此传递给它们的任何参数进行评估.它们没有短路能力.