SQL可选参数

时间:2019-11-25 11:57:10

标签: sql sql-server

我正在努力在MS SQL 2017中设置可选参数。应该这样做:

  
      
  1. 如果参数为null,则忽略该条件,但应用其他条件
  2.   
  3. 如果设置了参数,则应用条件
  4.   

下面的代码仅在设置了参数的情况下有效,但是如果参数为null,则不会显示任何结果。

DECLARE @ShowBenefitsValidatedAfter Date
--SET @ShowBenefitsValidatedAfter = NULL
SET @ShowBenefitsValidatedAfter = DATEADD(month, -1, GETDATE())


WHERE @ShowBenefitsValidatedAfter < IIF(@ShowBenefitsValidatedAfter IS NULL, @ShowBenefitsValidatedAfter, B.BenefitValidationActualDate)
AND B.Status <> 'Cancelled'

您能告诉我,如何修改条件?

非常感谢!

2 个答案:

答案 0 :(得分:4)

通常表示为:

WHERE (@ShowBenefitsValidatedAfter IS NULL OR 
       B.BenefitValidationActualDate > @ShowBenefitsValidatedAfter
      ) AND 
      B.Status <> 'Cancelled'

几乎所有与NULL的比较都将是NULL,包括<。您将从与@ShowBenefitsValidatedAfter进行比较开始,因此结果将是NULL

答案 1 :(得分:3)

像戈登一样,这种逻辑通常表示为:

WHERE  (@Parameter IS NULL 
   OR   YourColumn = @Parameter)
  AND ...

但是,与此有关的问题是,这可能会导致查询计划的缓存不足,因为@Parameter的值为NULL以及何时没有的估计可能会很大不同。

对于像这里一样简单的事情,OPTION (RECOMPILE)将是最简单的解决方案:

WHERE (B.BenefitValidationActualDate > @ShowBenefitsValidatedAfter
   OR  @ShowBenefitsValidatedAfter IS NULL)
  AND  B.[Status] != 'Cancelled
OPTION (RECOMPILE);

对于更复杂的查询,我个人建议使用动态SQL来构建适当的WHERE,以确保您参数化 sp_executesql语句(不要将值注入到声明...)。然后,可以在重新运行查询时将计划缓存并使用。以上将强制每次重新制定计划;可能会对大型,复杂的查询产生性能影响。