在 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 循环中中断关键字与变量的主要内容,如果未能解决你的问题,请参考以下文章

RF 关键字、变量与循环

32个C语言关键字

python中的循环和编码

C语言初阶笔记初识c语言

RF之关键字和循环

while循环与do while循环