嵌套 SQL WHILE 循环只不过是将 WHILE 循环放置在另一个 WHILE 循环内部。嵌套的 WHILE 循环在处理多层数据时非常有用。因为当我们想要选择分层数据时,我们必须使用这种嵌套的 WHILE 循环来提取分层数据。但请在使用时务必小心。
嵌套 WHILE 循环语法
Sql Server 嵌套 WHILE 循环的语法如下所示。
WHILE Expression BEGIN WHILE @Val2 <= 10 BEGIN -- Second While Loop Statements Statement 1 Statement 2 ........... Statement N END -- Below Statements are Outside the Second While Loop -- First While Loop Statements Statement 1 Statement 2 ........... Statement N END -- This Statement is Outside the First While Loop
如果您仔细观察上面的嵌套 WHILE 循环语法,我们会将 WHILE 循环放在另一个 WHILE 循环里面。我们在之前的文章中已经解释过 WHILE 循环的语法。
步骤 1:首先,它会检查第一个 WHILE 循环内的条件。
- 如果表达式结果为 True,则执行 WHILE 循环内的 begin 和 end 代码块。接下来,它将启动第二个 WHILE 循环。转到步骤 2。
- 如果结果为 False,则退出 WHILE 循环。
步骤 2:它将验证嵌套 SQL WHILE 循环(第二个 WHILE 循环)中的条件。
- 如果结果为 True,则执行第二个 WHILE 循环 begin…end 内的代码。这意味着 SQL Server 将运行从语句 1 到 N 的语句。
- 如果为 False,则退出第二个 WHILE 循环。
步骤 3:一旦退出第二个 WHILE 循环,它将再次检查第一个 WHILE 循环中的条件(重复步骤 1)。
嵌套 SQL WHILE 循环示例
这个嵌套 WHILE 循环程序将打印 1 和 2 的乘法表,直到 10。为此,我们将一个 WHILE 循环嵌套在另一个循环内,称为嵌套循环。
--Nested SQL While Loop Example DECLARE @Val1 INT, @Val2 INT SET @Val1 = 1 WHILE @Val1 <= 2 BEGIN SET @Val2 = 1 WHILE @Val2 <= 10 BEGIN PRINT CONVERT(VARCHAR, @Val1) + ' * ' + CONVERT(VARCHAR, @Val2) + ' = ' + CONVERT(VARCHAR, @Val1 * @Val2) SET @Val2 = @Val2 + 1 END SET @Val1 = @Val1 + 1 END

在此 SQL 嵌套 WHILE 循环示例中,我们首先创建了两个变量,分别称为 Val1 和 Val2,然后使用以下语句将 @Val1 初始化为 1。
DECLARE @Val1 INT, @Val2 INT SET @Val1 = 1
在下一行,我们使用了 SQL Server WHILE 循环表达式。如果表达式结果为真,它将进入嵌套 WHILE 循环。
WHILE @Val1 <= 2 BEGIN SET @Val2 = 1 WHILE @Val2 <= 10 BEGIN PRINT CONVERT(VARCHAR, @Val1) + ' * ' + CONVERT(VARCHAR, @Val2) + ' = ' + CONVERT(VARCHAR, @Val1 * @Val2) SET @Val2 = @Val2 + 1 END SET @Val1 = @Val1 + 1 END
从上面的屏幕截图可以看到,此嵌套 SQL WHILE 循环查询打印了 1 和 2 的乘法表。
第一个 WHILE 循环的第一次迭代
在第一个 WHILE 循环中,@Val1 被初始化为 1,然后它将检查 @Val1 是否小于或等于 2。此条件(1 <= 2)为 True,因此它将进入第二个 WHILE 循环。
嵌套 WHILE 循环或第二个 WHILE 循环的第一次迭代
在第二个 WHILE 循环中,@Val2 被初始化为 1,并检查 @Val2 是否小于或等于 10。此条件为 True。因此,第二个 WHILE 循环内的语句将执行。
PRINT CONVERT(VARCHAR, @Val1) + ' * ' + CONVERT(VARCHAR, @Val2) +
' = ' + CONVERT(VARCHAR, @Val1 * @Val2)
@Val1 * @Val2 ==> 1 * 1 = 1
接下来,@Val2 的值将增加 1(SET @Val2 = @Val2 + 1)。请参阅 算术运算符 文章以了解 + 符号的含义。
第二个 WHILE 循环的第二次迭代
在这里,@Val2 增加了一。所以 @Val2 = 2。它将检查 @Val2 是否小于或等于 10。此条件为 True。因此,它将执行第二个 WHILE 循环内的语句。
@Val1 * @Val2 ==> 1 * 2 = 2
接下来,@Val2 的值将增加 1。
此过程将重复进行,直到 @Val2 达到 11。一旦 SQL 嵌套 WHILE 循环内的条件失败,编译器将退出第二个 WHILE 循环,@Val1 的值将增加 1(SET @Val1 = @Val1 + 1)。
第一个 WHILE 循环的第二次迭代
@Val1 = 2。检查 @Val1 是否小于或等于 2。此条件(2 <= 2)为 True,因此它进入第二个 WHILE 循环。
第二个 WHILE 循环的第一次迭代
在第二个 WHILE 循环中,@Val2 将初始化为值 1,并检查 @Val2 是否小于或等于 10。此条件为 True,因此它执行第二个 WHILE 循环内的语句。
@Val1 * @Val2 ==> 2 * 1 = 2
接下来,@Val2 的值将增加 1(SET @Val2 = @Val2 + 1)。
第二个 WHILE 循环的第二次迭代
在这里,@Val2 将增加 1,所以 @Val2 = 2。接下来,它将检查 @Val2 是否小于或等于 10。条件(2 <= 10)为 True,因此它将开始执行第二个 WHILE 循环内的语句。
@Val1 * @Val2 ==> 2 * 2 = 4
接下来,@Val2 的值将增加 1(SET @Val2 = @Val2 + 1)。
此过程将重复进行,直到 @Val2 达到 11。一旦达到 11,第二个 WHILE 循环内的条件(11 <= 10)将失败。因此,它将退出嵌套 WHILE 循环,@Val1 的值将增加 1(SET @Val1 = @Val1 + 1)。
第一个 WHILE 循环的第三次迭代
在这里,i = 3 表示表达式(@Val1 <= 2)将为 False。因此,WHILE 循环将终止,请记住,无需检查第二个循环。