CASE 表达式在 SQL 服务器中工作但在 Visual Studio Reporting Services 中不工作
CASE expression working in SQL Server but not working in Visual Studio Reporting Services
有一个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 服务器中正常工作,但是当添加到报告中时,除 null 之外的所有值都不起作用。参数 @country 具有以下值:德国、西班牙、法国、意大利。报告中的参数只有在用户必须自己输入国家时才有效。如果在参数属性中写入可用值,它们将不起作用。此处未包含的其他参数可以正常工作,但它们本身没有 CASE。会不会是CASE表达式的问题?
我发现第二个 CASE 表达式可能存在 2 个问题:
1) 如果 mpfmain.mpflang 为 NULL,则用等号与 NULL 进行比较。即使@country 也为 NULL,这也不起作用。
2) 您缺少 ELSE 部分。这当然不是强制性的,但请考虑如果 part.sm 为 NULL,或者 part.sm 的值不同于 'MANUFACTURED'.
会发生什么
您可能会受益于围绕列或参数而不是 NULL 的 ISNULL 方法。您可以在此处阅读有关 ISNULL 方法的更多信息:
https://docs.microsoft.com/en-us/sql/t-sql/functions/isnull-transact-sql
case
表达式只会使 where
子句更难遵循和更难优化。它们通常可以在没有 case
:
的情况下重写
where (@obsolete is null or part.drawissno = @obsolete) and
(@country is null or (part.sm = 'MANUFACTURED' and mpfmain.mpflang = @country))
有一个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 服务器中正常工作,但是当添加到报告中时,除 null 之外的所有值都不起作用。参数 @country 具有以下值:德国、西班牙、法国、意大利。报告中的参数只有在用户必须自己输入国家时才有效。如果在参数属性中写入可用值,它们将不起作用。此处未包含的其他参数可以正常工作,但它们本身没有 CASE。会不会是CASE表达式的问题?
我发现第二个 CASE 表达式可能存在 2 个问题:
1) 如果 mpfmain.mpflang 为 NULL,则用等号与 NULL 进行比较。即使@country 也为 NULL,这也不起作用。
2) 您缺少 ELSE 部分。这当然不是强制性的,但请考虑如果 part.sm 为 NULL,或者 part.sm 的值不同于 'MANUFACTURED'.
会发生什么您可能会受益于围绕列或参数而不是 NULL 的 ISNULL 方法。您可以在此处阅读有关 ISNULL 方法的更多信息:
https://docs.microsoft.com/en-us/sql/t-sql/functions/isnull-transact-sql
case
表达式只会使 where
子句更难遵循和更难优化。它们通常可以在没有 case
:
where (@obsolete is null or part.drawissno = @obsolete) and
(@country is null or (part.sm = 'MANUFACTURED' and mpfmain.mpflang = @country))