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