我想创建一个包含两列(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
答案 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秒。