SQL可选参数

SQL可选参数,sql,sql-server,Sql,Sql Server,我正在努力在MS SQL 2017中设置可选参数。它应该做到: 如果参数为null,则忽略该条件,但应用其他条件 如果设置了参数,则应用该条件 下面的代码仅适用于设置了参数的情况,但如果参数为null,则不会显示任何结果 DECLARE @ShowBenefitsValidatedAfter Date --SET @ShowBenefitsValidatedAfter = NULL SET @ShowBenefitsValidatedAfter = DATEADD(month, -1, GETD

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

如果参数为null,则忽略该条件,但应用其他条件 如果设置了参数,则应用该条件 下面的代码仅适用于设置了参数的情况,但如果参数为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'
你能告诉我如何修改条件吗


非常感谢

这通常表示为:

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

几乎所有与NULL的比较都是NULL,包括像Gordon所示的,这样的逻辑通常表示为:

WHERE (@ShowBenefitsValidatedAfter IS NULL OR 
       B.BenefitValidationActualDate > @ShowBenefitsValidatedAfter
      ) AND 
      B.Status <> 'Cancelled'
WHERE  (@Parameter IS NULL 
   OR   YourColumn = @Parameter)
  AND ...
然而,问题是,这可能会导致缓存不良的查询计划,因为@Parameter何时具有NULL值和何时不具有NULL值的估计值可能会有很大的不同

对于像这里这样简单的东西,选项重新编译将是最简单的解决方案:

WHERE (B.BenefitValidationActualDate > @ShowBenefitsValidatedAfter
   OR  @ShowBenefitsValidatedAfter IS NULL)
  AND  B.[Status] != 'Cancelled
OPTION (RECOMPILE);
对于更复杂的查询,我个人建议使用动态SQL构建适当的WHERE,确保您将sp_executesql语句参数化,而不是将值注入语句中。。。。然后可以缓存这些计划,并在重新运行查询时使用它们。上述情况将迫使每次重新制定计划;这可能会对大型、复杂的queryes产生性能影响