【问题标题】:Break keyword vs Variable in WHILE loop在 WHILE 循环中中断关键字与变量
【发布时间】: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 请具体说明。我必须对表的每一行执行一组操作和业务登录。我该如何实现。

标签: sql sql-server sql-server-2008-r2 while-loop break


【解决方案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 'STACKOVERFLOW' // 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 'STACKOVERFLOW' // 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 

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2013-02-03
    • 2023-03-17
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多