基于用户输入的重复事件插入行的存储过程

时间:2016-01-12 10:03:59

标签: sql-server tsql stored-procedures

我在网站上实施了一个系统,允许用户将事件添加到日历中。他们可以通过输入它将重复出现的天数来选择这是否是重复发生的事件。

例如:

用户已输入活动于2016年1月25日开始。 用户已将事件设置为每2天重复一次。 用户未设置结束日期。

存储过程应在2月27日,29日,31日,2月2日插入行,依此类推。此重复活动将默认设置为1年后结束。

我将使用调度程序每天通过Azure SQL运行此存储过程,并且我使用SQL Server Management Studio 2014。

1 个答案:

答案 0 :(得分:1)

要在这样的重复间隔中插入日期,我认为递归CTE最简单。您可以在此处阅读有关CTE的更多信息:https://msdn.microsoft.com/en-us/library/ms175972.aspx

CREATE PROCEDURE dbo.GetIntervalDates (
    @StartDate DATE
    ,@EndDate DATE = NULL
    ,@DayInterval INT
)
AS
SET NOCOUNT ON;

IF (@EndDate IS NOT NULL AND @EndDate <= @StartDate)
BEGIN
    RAISERROR('Start date cannot precede/equal the end date.', 16, 1)
END

;WITH CTE AS (
SELECT @StartDate AS StartDate

UNION ALL

SELECT DATEADD(DAY, @DayInterval, StartDate) 
FROM CTE
WHERE (
    (@EndDate IS NULL AND DATEADD(DAY, @DayInterval, StartDate) < DATEADD(YEAR, 1, @StartDate))
    OR
    (DATEADD(DAY, @DayInterval, StartDate) < @EndDate) 
    )
)
SELECT * 
FROM CTE
OPTION (MAXRECURSION 365)

GO

注意@EndDate参数为null,在这种情况下,该过程将默认为一年。 以下是一些例子:

EXEC dbo.GetIntervalDates @StartDate = '2016-01-12', @DayInterval = 22
EXEC dbo.GetIntervalDates @StartDate = '2016-01-12', @EndDate = '2016-03-12', @DayInterval = 22
EXEC dbo.GetIntervalDates @StartDate = '2016-01-12', @EndDate = '2016-01-12', @DayInterval = 22
EXEC dbo.GetIntervalDates @StartDate = '2016-01-12', @EndDate = '2015-01-12', @DayInterval = 22