我正在努力在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'
您能告诉我,如何修改条件?
非常感谢!
答案 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
语句(不要将值注入到声明...)。然后,可以在重新运行查询时将计划缓存并使用。以上将强制每次重新制定计划;可能会对大型,复杂的查询产生性能影响。