【问题标题】:CASE expression working in SQL Server but not working in Visual Studio Reporting ServicesCASE 表达式在 SQL Server 中有效,但在 Visual Studio Reporting Services 中无效
【发布时间】:2020-05-08 09:26:57
【问题描述】:

有一个where语句:

WHERE (@obsolete=(case  when part.drawissno = 'OBS' then 'OBS' else 'NO' end) or @obsolete is null)
and ((CASE WHEN part.sm = 'MANUFACTURED' THEN mpfmain.mpflang END) = @country or @country IS NULL)

参数在 SQL Server 中可以正常工作,但是当添加到报表中时,除 null 之外的所有值都不起作用。参数 @country 具有以下值:德国、西班牙、法国、意大利。报告中的参数仅在用户必须自己输入国家/地区时才起作用。如果在参数属性中写入可用值,它们将不起作用。此处未包含的其他参数可以正常工作,但它们本身没有 CASE。会不会是 CASE 表达式的问题?

【问题讨论】:

  • 不是case表达式的问题。几乎可以肯定是值不匹配的问题。如果我没记错的话,SSRS 在处理参数时是区分大小写的——而 SQL Server 不是。

标签: sql sql-server reporting-services reporting


【解决方案1】:

case 表达式只会使where 子句更难遵循和优化。它们通常可以在没有case 的情况下重写:

where (@obsolete is null or part.drawissno = @obsolete) and
      (@country is null or (part.sm = 'MANUFACTURED' and mpfmain.mpflang = @country))

【讨论】:

    【解决方案2】:

    我发现第二个 CASE 表达式可能存在 2 个问题:

    1) 如果 mpfmain.mpflang 为 NULL,那么你用等号与 NULL 进行比较。即使@country 也是 NULL,这也不起作用。

    2) 您缺少 ELSE 部分。这当然不是强制性的,但请考虑如果 part.sm 为 NULL 或 part.sm 的值不是 'MANUFACTURED' 会发生什么。

    您可能会从围绕列或参数的 ISNULL 方法中受益,而不是可以为 NULL。您可以在此处阅读有关 ISNULL 方法的更多信息:

    https://docs.microsoft.com/en-us/sql/t-sql/functions/isnull-transact-sql

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多