如何在SSMS中将递归生成的日期列存储为数据库表或视图
将递归生成的日期存储为数据库表的方法
你可以通过两种常见方式把递归CTE生成的日期存储为数据库表:
方法1:先创建表再插入数据
首先定义目标表的结构(推荐添加主键约束避免重复数据):
CREATE TABLE CalendarTable ( orderDate DATE PRIMARY KEY );
然后修改你的递归查询,将结果插入到新建的表中:
DECLARE @startdate DATE = '2014-01-01'; DECLARE @enddate DATE = '2023-12-31'; WITH calendar AS ( SELECT @startdate AS [orderDate] UNION ALL SELECT DATEADD(dd, 1, [orderdate]) FROM calendar WHERE DATEADD(dd, 1, [orderdate]) <= @enddate ) INSERT INTO CalendarTable (orderDate) SELECT orderDate FROM calendar OPTION (MAXRECURSION 0);
方法2:自动创建表并插入数据
使用SELECT INTO语句,无需提前创建表,系统会根据查询结果自动生成表结构:
DECLARE @startdate DATE = '2014-01-01'; DECLARE @enddate DATE = '2023-12-31'; WITH calendar AS ( SELECT @startdate AS [orderDate] UNION ALL SELECT DATEADD(dd, 1, [orderdate]) FROM calendar WHERE DATEADD(dd, 1, [orderdate]) <= @enddate ) SELECT orderDate INTO CalendarTable FROM calendar OPTION (MAXRECURSION 0);
注意事项
OPTION (MAXRECURSION 0)必须保留,因为你的日期范围跨度较大,超过了SQL Server默认的100次递归限制- 如果需要重复执行脚本,可先添加表存在性判断,比如先删除表或清空表数据后再插入
- 给
orderDate列添加主键或唯一约束,能防止意外插入重复日期
内容的提问来源于stack exchange,提问作者oyelowo toyyib
相关产品推荐
相关产品推荐

