请考虑以下表格:
Item(id, dueDate)
DueStatus(id, code, whereClause)
DueStatus表具有以下值:
1/OVERDUE/'dueDate < getdate()'
2/DUE/'dueDate = getdate()'
想法是将where子句存储在表中,然后使用它来创建动态SQL以针对所有不同状态执行。
以这种方式进行操作(相对于仅手写查询)有好处吗?
目标是能够添加诸如3/NEXTFIVEDAYS/'dueDate = dateadd(day,datediff(day,-5,@currentDate),0)'
之类的DueStatus,而不必更改存储过程。
我以前没有走这条路,想要确保我没有错过任何重要的事情。
答案 0 :(得分:1)
我不会那样做。问题来自更新where列:
请参阅上面的评论,以了解更多原因。
答案 1 :(得分:1)
对于基于两个日期之间的差异的动态状态,我发现这是一个有趣的挑战。我想到了这个。在大多数情况下,虽然可能不是100%,但您可以使用它。
CREATE TABLE [dbo].[Items](
[ID] [int] NULL,
[DueDate] [date] NULL
) ON [PRIMARY]
INSERT INTO dbo.Items(ID, DueDate) VALUES (1, '12/1/2018')
INSERT INTO dbo.Items(ID, DueDate) VALUES (2, '12/2/2018')
INSERT INTO dbo.Items(ID, DueDate) VALUES (3, '12/6/2018')
INSERT INTO dbo.Items(ID, DueDate) VALUES (4, '12/6/2018')
INSERT INTO dbo.Items(ID, DueDate) VALUES (5, '12/10/2018')
INSERT INTO dbo.Items(ID, DueDate) VALUES (6, '2/1/2019')
INSERT INTO dbo.Items(ID, DueDate) VALUES (7, '1/1/2013')
INSERT INTO dbo.Items(ID, DueDate) VALUES (8, '12/5/2018')
CREATE TABLE [dbo].[Statuses](
[DayDifference] [int] NULL,
[StatusText] [varchar](32),
)
INSERT INTO dbo.Statuses(DayDifference, StatusText) VALUES(0, 'On Time')
INSERT INTO dbo.Statuses(DayDifference, StatusText) VALUES(1, '1 Day Late')
INSERT INTO dbo.Statuses(DayDifference, StatusText) VALUES(5, '5 Days Late')
;WITH Data AS (
SELECT i.ID AS ItemID,
i.DueDate,
DATEDIFF(DAY, i.DueDate, GETDATE()) AS DayDifference
FROM dbo.Items i
WHERE DATEDIFF(DAY, i.DueDate, GETDATE()) >= 0 -- Just get the on-times and lates.
)
SELECT d.ItemID,
d.DayDifference AS DaysLate,
CASE WHEN s.StatusText IS NULL
THEN 'Unknown'
ELSE s.StatusText
END AS StatusText
FROM Data d
LEFT JOIN dbo.Statuses s ON d.DayDifference = s.DayDifference
结果如下,今天运行,2018年12月6日:
ItemID DaysLate StatusText
-------------------------------
1 5 5 Days Late
2 4 Unknown
3 0 On Time
4 0 On Time
7 2165 Unknown
8 1 1 Day Late
请注意,这是一个起点,可能需要根据您的确切用例进行建模。