Sql server 每隔5秒向表中插入连续的日期时间值

Sql server 每隔5秒向表中插入连续的日期时间值,sql-server,tsql,datetime,while-loop,datetimeoffset,Sql Server,Tsql,Datetime,While Loop,Datetimeoffset,假设我有一张这样的桌子: CREATE TABLE table1 ( CreatedAt DAteTimeOffset NULL ); 2018-10-08 05:00:00.0000000 +00:00 2018-10-08 05:00:05.0000000 +00:00 2018-10-08 05:00:10.0000000 +00:00 2018-10-08 05:00:15.0000000 +00:00 2018-10-08 05:00:20.0000000 +00:00

假设我有一张这样的桌子:

CREATE TABLE table1
(
    CreatedAt   DAteTimeOffset  NULL
);
2018-10-08 05:00:00.0000000 +00:00
2018-10-08 05:00:05.0000000 +00:00
2018-10-08 05:00:10.0000000 +00:00
2018-10-08 05:00:15.0000000 +00:00
2018-10-08 05:00:20.0000000 +00:00
2018-10-08 05:00:25.0000000 +00:00
2018-10-08 05:00:30.0000000 +00:00
2018-10-08 05:00:35.0000000 +00:00
2018-10-08 05:00:40.0000000 +00:00
2018-10-08 05:00:45.0000000 +00:00
2018-10-08 05:00:50.0000000 +00:00
2018-10-08 05:00:55.0000000 +00:00
2018-10-08 05:01:00.0000000 +00:00
2018-10-08 05:01:05.0000000 +00:00
2018-10-08 05:01:10.0000000 +00:00
2018-10-08 05:01:15.0000000 +00:00
如何在
while
循环中插入表500行,并使每个日期每5秒一次?我希望我的结果是这样的:

CREATE TABLE table1
(
    CreatedAt   DAteTimeOffset  NULL
);
2018-10-08 05:00:00.0000000 +00:00
2018-10-08 05:00:05.0000000 +00:00
2018-10-08 05:00:10.0000000 +00:00
2018-10-08 05:00:15.0000000 +00:00
2018-10-08 05:00:20.0000000 +00:00
2018-10-08 05:00:25.0000000 +00:00
2018-10-08 05:00:30.0000000 +00:00
2018-10-08 05:00:35.0000000 +00:00
2018-10-08 05:00:40.0000000 +00:00
2018-10-08 05:00:45.0000000 +00:00
2018-10-08 05:00:50.0000000 +00:00
2018-10-08 05:00:55.0000000 +00:00
2018-10-08 05:01:00.0000000 +00:00
2018-10-08 05:01:05.0000000 +00:00
2018-10-08 05:01:10.0000000 +00:00
2018-10-08 05:01:15.0000000 +00:00
等等

我在这里有一个while循环,但我不知道如何实现每5 sek插入值为的连续行

DECLARE
    @i int = 0

WHILE @i < 500
BEGIN
    INSERT INTO table1
    (CreatedAt)
    VALUES
    (?)
END
声明
@i int=0
而@i<500
开始
插入表1
(创建数据)
价值观
(?)
结束

尝试使用基于集合的方法。通常速度要快得多:

WITH N AS --generate 500 rows (1..500)
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) N
    FROM (VALUES (1),(2),(3),(4),(5)) A(A)
    CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) B(B)
    CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) C(C)
)
INSERT INTO table1 SELECT DATEADD(SECOND, (N-1)*5, SYSDATETIME()) FROM N
如果您确实需要一个循环(不鼓励),可以使用以下方法:

DECLARE @i int = 0;
DECLARE @d DAteTimeOffset = SYSDATETIME();
WHILE @i<500
BEGIN
    INSERT table1 VALUES (@d);
    SET @d = DATEADD(second, 5, @d);
    SET @i += 1;
END
声明@i int=0;
声明@d DAteTimeOffset=SYSDATETIME();

而@i则尝试使用基于集合的方法。通常速度要快得多:

WITH N AS --generate 500 rows (1..500)
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) N
    FROM (VALUES (1),(2),(3),(4),(5)) A(A)
    CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) B(B)
    CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) C(C)
)
INSERT INTO table1 SELECT DATEADD(SECOND, (N-1)*5, SYSDATETIME()) FROM N
如果您确实需要一个循环(不鼓励),可以使用以下方法:

DECLARE @i int = 0;
DECLARE @d DAteTimeOffset = SYSDATETIME();
WHILE @i<500
BEGIN
    INSERT table1 VALUES (@d);
    SET @d = DATEADD(second, 5, @d);
    SET @i += 1;
END
声明@i int=0;
声明@d DAteTimeOffset=SYSDATETIME();

而@i我认为Zohar的意思是这个解决方案

declare @t table (CreatedAt datetime)

insert into @t 
select top 500 
       dateadd(second, (row_number() over (order by @@spid ) - 1) * 5, sysdatetime()) 
from   sys.objects 
  --cross join sys.objects a cross join sys.objects b 

select * from @t

我认为Zohar的意思是这个解决方案

declare @t table (CreatedAt datetime)

insert into @t 
select top 500 
       dateadd(second, (row_number() over (order by @@spid ) - 1) * 5, sysdatetime()) 
from   sys.objects 
  --cross join sys.objects a cross join sys.objects b 

select * from @t

这是使用选定日期TimeFromParts(2018、10、12、10、22、5、0)并仅用变量替换数字的最佳选择。但使用统计表确实会更好。这是一个很好的选择,可以使用选定的datetimefromparts(2018、10、12、10、22、5、0)并用变量替换数字。但是使用计分表确实会更好这是一个很好的答案。只是一个旁注:您不必指定所有这些值,只需从sys.objects执行
select top 500 row_number()(order by@@spid)
(如果是小型数据库,请添加交叉连接:
sys.objects交叉连接sys.objects b
sys.objects
,但对于小型数据集,这将需要IO到光盘(以获取对象列表),其中为(虚拟)理货表完全可以在内存中完成。这是一个很好的答案。只是一个旁注:不必指定所有这些值,只需从sys.objects执行
select top 500 row_number()(order by@@spid)
(如果它是一个小型数据库,请添加一个交叉连接:
sys.objects交叉连接sys.objects b
sys.objects
,但对于一个小型数据集,这将需要IO到光盘(以获取对象列表),其中(虚拟)理货表完全可以在内存中完成。