【问题标题】:SQL While Loop keep runningSQL While 循环继续运行
【发布时间】:2019-02-26 05:20:24
【问题描述】:
delete from summary
Declare @rows int
set @rows=0


while @rows <29000
begin
    insert into Summary 
    select  * from table a full join table b on 
    ID = ID
    where pk is not null
end

我尝试运行上面的代码,但它一直在不停地运行,当我最终停止它时,它给出了以下结果:

(28029 行受影响)

(28029 行受影响) 消息 2627,第 14 层,状态 1,第 13 行 违反 PRIMARY KEY 约束“PK_Summary”。无法在对象“dbo.Summary”中插入重复键。 声明已终止。

然后我认为这是 PK 问题,所以我从表中删除了所有内容,只运行插入语句而不使用 while 循环,它可以工作。所以我猜测还有其他问题,但我不知道它是什么。其他人可以为我指出吗?而且我已经验证了表中只有 28K+ 行。

【问题讨论】:

  • 我没有看到你增加了 @rows,所以 @rows 将永远小于 29000

标签: sql while-loop


【解决方案1】:

考虑更新循环内的@rows 变量以避免无限循环。

这可以通过

SET @rows = @@ROWCOUNT

但是,这仍然会导致查询执行两次并违反主键。您将需要多几行以避免运行两次查询。

由于您的意图是限制插入的行,我建议使用TOP 来限制选择的行而不是循环。

insert into Summary 
select top 29000 * from table a full join table b on ID = ID
where pk is not null

另外,我建议在任何带有 TOP 的查询中提供 ORDER BY 子句。如果您不定义顺序,则由数据库决定,数据库可以根据需要做出不同的决定。

【讨论】:

  • 如果他们使用@@ROWCOUNT 不总是1吗?因为每次迭代只插入一条记录?
  • @RyanWilson 他们正在插入 28029 行,这是连接的结果。
  • 如果他们进行批量插入,那为什么还要循环呢?
  • 但有时记录超过 29K,我们希望保持在 29K 或更少。
  • @RyanWilson 是的,我们需要知道操作的上下文来判断提出的解决方案是否有效。无论如何,我们知道这段代码在做什么,以及为什么它有它的输出。
猜你喜欢
  • 2015-07-26
  • 1970-01-01
  • 2014-03-11
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
相关资源
最近更新 更多