如何为SQL Server存储过程传递可选日期或日期范围参数
可选日期范围存储过程实现方案
不需要编写CASE语句,沿用你已经熟悉的空值判断+OR逻辑即可实现三种场景的适配,逻辑清晰易维护。
首先将存储过程的两个日期参数都设置默认值为NULL:
CREATE PROCEDURE 你的存储过程名 @PeriodFrom DATE = NULL, @PeriodTo DATE = NULL AS BEGIN -- 你的查询逻辑 SELECT * FROM 你的表名 WHERE -- 两个参数都不传:不限制日期 (@PeriodFrom IS NULL AND @PeriodTo IS NULL) -- 仅传@PeriodFrom:精确匹配该日期(和你之前的单参数逻辑保持一致) OR (@PeriodFrom IS NOT NULL AND @PeriodTo IS NULL AND Period = @PeriodFrom) -- 仅传@PeriodTo:精确匹配该日期 OR (@PeriodFrom IS NULL AND @PeriodTo IS NOT NULL AND Period = @PeriodTo) -- 两个参数都传:匹配日期范围 OR (Period BETWEEN @PeriodFrom AND @PeriodTo) -- 可选:大数据量场景下添加,解决OR逻辑导致的索引失效/参数嗅探问题 OPTION (RECOMPILE) END
如果你希望仅传单个参数时是半开区间筛选(比如只传开始日期就查所有大于等于该日期的记录),只需要调整中间两个判断条件即可:
WHERE (@PeriodFrom IS NULL AND @PeriodTo IS NULL) OR (@PeriodFrom IS NOT NULL AND @PeriodTo IS NULL AND Period >= @PeriodFrom) OR (@PeriodFrom IS NULL AND @PeriodTo IS NOT NULL AND Period <= @PeriodTo) OR (Period BETWEEN @PeriodFrom AND @PeriodTo)
注意事项
- 如果你的Period字段是带时分秒的DATETIME/DATETIME2类型,不要用BETWEEN,会漏掉结束日期当天0点之后的记录,建议修改为
Period >= @PeriodFrom AND Period < DATEADD(DAY, 1, @PeriodTo) - 数据量小的场景可以不加
OPTION (RECOMPILE),对性能影响可以忽略
内容的提问来源于stack exchange,提问作者Brian Battles
相关产品推荐
相关产品推荐

