如何使用while循环和waitfor延迟更新表以插入当前日期,记录之间的延迟为一秒?

时间:2018-12-31 10:37:25

标签: sql sql-server stored-procedures

我想创建一个包含两列(id int,今天的datetime)的表,并使用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

1 个答案:

答案 0 :(得分:2)

每行具有相同值的原因是因为您没有在.Value循环之前之前之外设置@Today的值。 WHILE返回标量值,并将变量设置为该值意味着将设置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

但是无论如何,循环都是一个错误的选择,因为RDBMS擅长基于集合的操作,而不是迭代操作。通过执行以下操作,您会更好地实现自己的目标:

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;

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