tsql - 如何在 SQL 中使用循环?

标签 tsql loops for-loop while-loop

在 TSQL 中,我想将以下代码从必须使用硬编码 dhome 更改为使用循环进行优化。我尝试添加循环失败的尝试也包括在内。

Declare  @dhome Tinyint, @bp smallint, @lr smallint, @q smallint

    // Set @dhome = 1
  While(@dhome <= 3) // My attempt to add a loop

  SELECT @lr = MAX(NQdDate), @q = NQd
  FROM NQdHistory
  WHERE dhomeId = @dhome 
  GROUP BY NQdDate, NQd

  SELECT @bd = COUNT(*)
  FROM bdhome
  WHERE NQdDate= @lr AND dhomeID= @dhome 

  DELETE FROM ND1 WITH(XLOCK)
  WHERE dhomeID= @dhome  AND NQdDate= @lr

  UPDATE NQdHistory
  SET Nbd = @q - @@RowCount - @bp, NBd = @bp
  WHERE NQdDate= @lr AND dhomeID= @dhome 

  Set @dhome = @dhome +1 //My attempt to end a loop

最佳答案

你走在正确的道路上。你错过了开始和结束。另外,请务必为 @dhome 指定一个值。看来您开始在第三行注释掉它:

Declare  @dhome Tinyint, @bp smallint, @lr smallint, @q smallint

    // Set @dhome = 1
While(@dhome <= 3) // My attempt to add a loop
begin
  SELECT @lr = MAX(NQdDate), @q = NQd
  FROM NQdHistory
  WHERE dhomeId = @dhome 
  GROUP BY NQdDate, NQd

  SELECT @bd = COUNT(*)
  FROM bdhome
  WHERE NQdDate= @lr AND dhomeID= @dhome 

  DELETE FROM ND1 WITH(XLOCK)
  WHERE dhomeID= @dhome  AND NQdDate= @lr

  UPDATE NQdHistory
  SET Nbd = @q - @@RowCount - @bp, NBd = @bp
  WHERE NQdDate= @lr AND dhomeID= @dhome 

  Set @dhome = @dhome +1 //My attempt to end a loop
end  

如果您熟悉 C/C#/C++,可以将 T-SQL 的 Begin 和 End 想象为大括号 {}(如果您更熟悉)使用 VB ThenEnd If。或者更像 pascals BeginEnd。你明白了:)

关于tsql - 如何在 SQL 中使用循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15770973/

相关文章:

javascript - 在 for 循环中使用 jQuery.each 将数组映射到元素文本?

c++ - 我的问题是关于 C++ 中数字和序列的重复以及如何打印它们?

Javascript for/in 循环 - 连接来自两个不同对象的项目?

sql-server - 在插入 XML 字段之前过滤重复节点

c# - 在 T-SQL 中将 '01-Sep-2017' 转换为 '01/09/2017'?

javascript - 如何使用双for循环从json中检索过滤后的数据

java - 在带有 for 循环的 if 语句中使用数组时找不到符号

c - for循环在c中不起作用

sql - 使用 LIKE 语句查询任何单词,而不是整个单词

sql-server - SELECT DISTINCT 的替代方法