在 WHILE 循环中中断关键字与变量
Posted
技术标签:
【中文标题】在 WHILE 循环中中断关键字与变量【英文标题】:Break keyword vs Variable in WHILE loop 【发布时间】:2013-06-26 23:19:05 【问题描述】:我们在 SQL Server 2008 中使用 WHILE
循环而不是光标。现在我想找出在我的程序中编写WHILE
循环的最佳方法。
方法一(使用 BREAK 关键字):
DECLARE @V_Counter INT = 1;
WHILE (1 = 1)
BEGIN
PRINT @V_Counter;
SET @V_Counter = @V_Counter + 1;
IF @V_Counter = 4
BEGIN
BREAK;
END
END
方法2(使用BOOL VARIABLE):
DECLARE @V_Counter INT = 1, @V_CloseLoop TINYINT = 1;
WHILE (@V_CloseLoop = 1)
BEGIN
PRINT @V_Counter;
SET @V_Counter = @V_Counter + 1;
IF @V_Counter = 4
BEGIN
SET @V_CloseLoop = 0;
END
END
我的问题是:
我必须使用哪种方法或两者相同? 我还有其他方法可以使用吗?提前谢谢...
【问题讨论】:
我们使用 WHILE 循环...而不是光标 -WHILE
仍然几乎和光标一样糟糕。您应该检查是否可以避免使用 WHILE
并采用真正基于集合的方法。 那确实会显着提高速度
@marc_s 您能否提供该方法的任何链接或任何示例。我想实现最佳方法而不是光标。我发现 While 循环比游标好。所以我试图在我的程序中实现它。
只需在 Google(或 Bing)中搜索 SQL Server Thinking in Sets
,您就会拥有 大量 链接,例如T-SQL Foundations: Thinking in Sets 和很多很多!
在许多情况下,使用内联函数也有助于避免游标。它会加快速度。
@revoua 请具体说明。我必须对表的每一行执行一组操作和业务登录。我该如何实现。
【参考方案1】:
我必须使用哪种方法或两种方法相同? 不,两者都不一样。
将变量设置为零仍然会执行之后的行,但循环中的任何其他内容都不会在 break 之后执行。
DECLARE @V_Counter INT = 1;
WHILE (1 = 1)
BEGIN
PRINT @V_Counter;
SET @V_Counter = @V_Counter + 1;
IF @V_Counter = 4
BEGIN
BREAK;
END
PRINT '***' // this is not executed.
END
DECLARE @V_Counter INT = 1, @V_CloseLoop TINYINT = 1;
WHILE (@V_CloseLoop = 1)
BEGIN
PRINT @V_Counter;
SET @V_Counter = @V_Counter + 1;
IF @V_Counter = 4
BEGIN
SET @V_CloseLoop = 0;
END
PRINT '***' // this is executed.
END
与将变量设置为零相比,使用 break 始终是一种干净的方法,因为当我们使用 break 时,代码将比其他方式更易于维护。
【讨论】:
感谢您的回答,但我没有在IF条件之后编写代码。我已经在 IF 条件之前编写了整个业务逻辑。那么哪种方法更好用呢? 没有。使用基于集合的语句,避免使用游标和 while 循环 抱歉,break
不是干净的方法。它通常被认为是糟糕的编程风格。仅在有充分理由的情况下使用它。
@JesúsLópez +1 表示“使用基于集合的语句”!【参考方案2】:
break
被认为是“糟糕的编程风格”。所以最好使用变量。除非你有充分的理由。
但尽量避免while
循环。在 SQL Server 中,您经常可以用出色的 SQL 语句替换循环,这些语句可以一次完成所有事情。
【讨论】:
感谢您的回答,但是我没有在IF条件之后编写代码。我在 IF 条件之前编写了整个业务逻辑,其中根据我的业务逻辑包括 50 多个查询。那么如何才能消除 WHILE 循环的使用呢? @SaharshShah 我只能在看到您的整个业务逻辑时才能回答这个问题。在 SQL Server 中,您通常采用与 Java 或 C# 不同的方法。 SQL 中的编程不应该在循环中完成,它是通过仅在 one 语句中处理大量事情的语句来完成的。然后你也会得到最好的表现。循环通常很慢而且很弱。顺便说一句,我根本不了解您的特定循环-您只是在数一个计数器,最多为 4 ... 这是一个示例代码。我正在动态运行循环。 @SaharshShah 动态是什么意思?你在生成代码吗?【参考方案3】:a) 你在这里做什么?我看到一个计数器最多计数为 4 ... ;)
b) 你可以这样重写它:
DECLARE @V_Counter INT = 1;
WHILE (@V_Counter < 4)
BEGIN
PRINT @V_Counter;
SET @V_Counter = @V_Counter + 1;
END
【讨论】:
以上是关于在 WHILE 循环中中断关键字与变量的主要内容,如果未能解决你的问题,请参考以下文章