在表中存储Where子句以获取状态

时间:2018-12-06 14:11:47

标签: sql sql-server sql-server-2017

请考虑以下表格:

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,而不必更改存储过程。

我以前没有走这条路,想要确保我没有错过任何重要的事情。

2 个答案:

答案 0 :(得分:1)

我不会那样做。问题来自更新where列:

  1. 如果列名更改了怎么办?
  2. 如果要在where子句中添加另一个条件怎么办?然后,您必须逐行运行,或者无论如何都要运行最初尝试运行的目录的根目录。
  3. 您的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

请注意,这是一个起点,可能需要根据您的确切用例进行建模。