如果你对GOTO关键字不是很反感,可以用它来模拟T-SQL中的DO/WHILE。考虑以下用伪代码编写的相当荒谬的示例:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
这是使用 goto 的等效 T-SQL 代码:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
注意GOTO 启用的解决方案和原始DO / WHILE 伪代码之间的一对一映射。使用WHILE 循环的类似实现如下所示:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
现在,您当然可以将此特定示例重写为简单的WHILE 循环,因为这不是DO / WHILE 构造的理想候选者。重点在于示例的简洁性而不是适用性,因为需要DO / WHILE 的合法案例很少见。
REPEAT / UNTIL,任何人(不在 T-SQL 中工作)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
...以及 T-SQL 中基于 GOTO 的解决方案:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
通过GOTO 的创造性使用和NOT 关键字的逻辑反转,原始伪代码与基于GOTO 的解决方案之间存在非常密切的关系。使用WHILE 循环的类似解决方案如下所示:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
可以说,对于REPEAT / UNTIL 的情况,基于WHILE 的解决方案更简单,因为if 条件没有反转。另一方面,它也更冗长。
如果不是因为所有对使用 GOTO 的蔑视,这些甚至可能是一些惯用的解决方案,因为在 T-SQL 代码中为了清晰度。
您可以自行决定使用它们,当您的开发人员发现您使用备受诟病的 GOTO 时,尽量不要让他们感到愤怒。