向SQL Server现有表插入数据:时间间隔1分钟至1年,其余列设为NULL
搞定SQL Server全年分钟级NULL数据插入需求
嘿,我来帮你解决这个向现有表插入1年每分钟间隔数据的问题!下面给你两种实用的方案,根据你的表结构和性能需求选就行:
方案一:递归CTE生成时间序列(简单易写)
如果你的表ValueID是自增主键(IDENTITY列),那插入的时候不用管它,数据库会自动生成。要是ValueID不是自增的,后面我会说怎么处理。
-- 先设置起始时间和结束时间(起始时间用你给的示例,结束时间是1年后) DECLARE @StartDateTime DATETIME = '2017-07-28 18:02:00'; DECLARE @EndDateTime DATETIME = DATEADD(YEAR, 1, @StartDateTime); -- 用递归CTE生成每分钟递增的时间序列 WITH TimeSeries AS ( SELECT @StartDateTime AS DateAndTime UNION ALL SELECT DATEADD(MINUTE, 1, DateAndTime) FROM TimeSeries WHERE DateAndTime < @EndDateTime ) -- 批量插入到你的表(把YourTableName换成实际表名) INSERT INTO YourTableName (DateAndTime, V1, V2, V3) SELECT DateAndTime, NULL, NULL, NULL FROM TimeSeries OPTION (MAXRECURSION 0); -- 必须加!因为一年有50多万分钟,远超默认递归上限100
小提示:
- 如果
ValueID不是自增列,就在SELECT语句里加上ROW_NUMBER() OVER (ORDER BY DateAndTime) AS ValueID,这样就能生成连续的ID值了。 - 确保V1、V2、V3这三列允许为NULL,不然插入会报错哦!
方案二:数字表生成法(大数据量更高效)
要是你觉得递归CTE性能不够,尤其是插入50多万条数据的时候,用数字表的方式会更快:
DECLARE @StartDateTime DATETIME = '2017-07-28 18:02:00'; DECLARE @EndDateTime DATETIME = DATEADD(YEAR, 1, @StartDateTime); -- 计算总共需要生成多少条数据 DECLARE @TotalMinutes INT = DATEDIFF(MINUTE, @StartDateTime, @EndDateTime); -- 用系统表生成临时数字序列(足够覆盖一年的分钟数) WITH Numbers AS ( SELECT TOP (@TotalMinutes + 1) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS Num FROM sys.all_columns ac1 CROSS JOIN sys.all_columns ac2 ) INSERT INTO YourTableName (DateAndTime, V1, V2, V3) SELECT DATEADD(MINUTE, Num, @StartDateTime) AS DateAndTime, NULL, NULL, NULL FROM Numbers OPTION (MAXDOP 1); -- 可选:限制并行度,避免占用过多数据库资源
注意事项:
- 插入前最好先在测试环境跑一遍,或者备份原表,避免误操作。
- 如果你的表在DateAndTime列上有唯一约束,不用担心,这个生成的时间序列是严格每分钟一条,不会重复。
内容的提问来源于stack exchange,提问作者Srini
相关产品推荐
相关产品推荐

