嵌套 SQL WHILE 循环

嵌套 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
Nested SQL While Loop 1

在此 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 循环将终止,请记住,无需检查第二个循环。