【问题标题】:How to update a table using while loops and waitfor delay to insert current date with a one second delay between records?如何使用while循环和waitfor延迟更新表以在记录之间插入当前日期并延迟一秒?
【发布时间】:2018-12-31 10:37:24
【问题描述】:

我想创建一个包含两列(id int,今天日期时间)的表,并使用 while 循环每 1 秒插入一次当前日期。但是,结果表显示所有行的时间相同。下面是我的代码。谁能帮我理解我做错了什么,好吗?谢谢!

declare @mytable table (id int, today datetime)

declare @id int=1

declare @today datetime=getdate()


while @id<10

begin

waitfor delay '00:00:01'

insert into @mytable values (@id,@today)

set @id=@id+1

end

【问题讨论】:

  • 你应该在waitfor delay '00:00:01'之后写set @today = getdate()
  • 你为什么要把它赋给一个变量呢?还有你为什么需要这个?
  • @ChetanRanpariya 非常感谢!
  • 你真正想在那里做什么?也许有更好的方法来做到这一点(当然是循环)。顺便说一句,更新表 向其中插入数据。

标签: sql sql-server stored-procedures


【解决方案1】:

每一行都具有相同值的原因是,除了 WHILE 循环之外,您没有在任何地方设置 @Today 的值。 GETDATE() 返回一个标量值,将变量设置为该值意味着它将设置GETDATE() 在运行SET 时返回的值。时间过去后变量的值不会改变。例如:

DECLARE @d datetime;
SET @d = GETDATE();
SELECT @d, GETDATE(); --Will return very similar values
WAITFOR DELAY '00:00:05';
SELECT @d, GETDATE(); --@d will have the same value as before, as its value is static, but GETDATE()'s value will have changed.

要做你想做的事,我认为@Today 的变量不需要任何变量,这正常工作:

DECLARE @mytable table (id int,
                        today datetime);

DECLARE @id int = 1;


WHILE @id < 10
BEGIN

    WAITFOR DELAY '00:00:01';

    INSERT INTO @mytable
    VALUES (@id, GETDATE());

    SET @id = @id + 1;

END;

然而循环是一个糟糕的选择,因为 RDBMS 擅长基于集合的操作,而不是迭代。通过这样做,你会更好地实现你所追求的:

DECLARE @mytable table (id int,
                        today datetime);

DECLARE @id int = 1;

WITH N AS (
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1
         CROSS JOIN N N2 --Not actually eneded here, but shows how to increase row count
    )
INSERT INTO @mytable (id,
                      today)
SELECT TOP 10
       T.I + @ID,
       DATEADD(SECOND, T.I, GETDATE())
FROM Tally T
ORDER BY T.I;

这将构建一个内联计数表,然后为 ID 为 10 的行插入一个值,并为每个递增的 ID 添加 1 秒。

【讨论】:

  • 不客气@Jurij。数据集方法对您有意义吗?重要的是你要理解为什么它是一个更好的方法;尤其是代码运行时间不到一秒,而您的原始代码至少需要 9 秒。
  • 确实有道理,效率更高。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
相关资源
最近更新 更多