我想创建一个存储过程,它将在给定日期范围内的每一天在表中创建一行。存储过程接受两个输入 - 用户所需日期范围的开始日期和结束日期。
所以,假设我有一张这样的桌子:
SELECT Day, Currency
FROM ConversionTable
Day 是一个 DateTime,而 Currency 只是一个整数。
为了简单起见,假设我始终希望每个插入的行的货币列为 1。因此,如果有人输入“2017 年 3 月 5 日”作为开始日期,输入“2017 年 4 月 11 日”作为结束日期,我想创建以下行:
2017-03-05 00:00:00, 1
2017-03-06 00:00:00, 1
...
2017-04-11 00:00:00, 1
编写存储过程代码以执行此操作的最佳方法是什么?我在我的测试环境中使用的是 SQL Server 2008 R2,但我们的真实环境使用的是 SQL Server 2012,因此如果 2012 中引入的新功能使这项任务更容易,我可以升级我的测试机器。
一种选择是递归 CTE:
DECLARE @StartDate datetime = '2017-03-05'
,@EndDate datetime = '2017-04-11'
;
WITH theDates AS
(SELECT @StartDate as theDate
UNION ALL
SELECT DATEADD(day, 1, theDate)
FROM theDates
WHERE DATEADD(day, 1, theDate) <= @EndDate
)
SELECT theDate, 1 as theValue
FROM theDates
OPTION (MAXRECURSION 0)
;
(MAXRECURSION
由于 Scott Hodgin 的评论,在下面添加了提示。)