【发布时间】:2019-04-21 19:10:43
【问题描述】:
我有一个存储过程,其中包括:
declare @dueTypeCode nvarchar(3) = 'ALL' --Is actually a parameter that is passed into the stored procedure
declare @today DateTime = GetUtcDate();
declare @tomorrow DateTime = dateadd(day,datediff(day,-1,GETUTCDATE()),0);
declare @fiveDaysFromNow DateTime = dateadd(day,datediff(day,-5,GETUTCDATE()),0);
if(@dueTypeCode = 'ALL')
Select * from Items
ELSE IF (@dueTypeCode = 'TODAY')
Select * from Items where DueDate = @today
ELSE IF (@dueTypeCode = 'NEXT5DAYS')
Select * from Items where DueDate >= @today and DueDate <= @fiveDaysFromNow
END
有没有什么办法可以把它包装成一条SQL语句来避免上面代码的重复?
实际的select语句要复杂得多,重复3次只是为了改变where子句似乎违反了DRY原则。
【问题讨论】:
-
您是否考虑过使用动态 SQL 或将所有逻辑放在单个
WHERE中并包含RECOMPILE选项? -
是和不是。您可以使用布尔逻辑来根据 @dueTypeCode 设置的内容来控制逻辑的哪一部分胜出,但是您会冒着创建低效查询的风险。逻辑的更大复杂性可能会使查询优化器感到困惑。因此,请注意“捕获所有”查询效率低下。
-
@Larnu,不,我没有考虑过动态 Sql。是的,我考虑过单个 where 子句,但不知道该怎么做。
-
@DanGuzman,这正是我想要的,谢谢。
标签: sql sql-server tsql datetime sql-server-2016