【问题标题】:T-SQL How to end an IF-ELSE IF-ELSE blockT-SQL 如何结束一个 IF-ELSE IF-ELSE 块
【发布时间】:2015-12-13 09:48:27
【问题描述】:

当我使用正确的参数运行以下过程以便不返回 -1 值时,我的 DML 语句都不会触发。我猜它把我所有的 DML 语句都当作ELSE 块的一部分。

SQL Server 2014

如何结束 IF-ELSE-ELSE-IF 块?

ALTER PROCEDURE [GenerateNumber] (
    @Code VARCHAR(2)
)
AS
BEGIN
    DECLARE @stringConcat VARCHAR = 'X';

    IF @Code = 'KP'
        SET @stringConcat += 'Y';
    ELSE IF @Code = 'RL'
        SET @stringConcat += 'Z';
    ElSE
        -- Return error code and stop processing
        SELECT -1;
        RETURN;

    BEGIN TRY
        -- Various DML statements...

        SELECT @successValue;
        RETURN;
    END TRY
    BEGIN CATCH
        SELECT -1;
        RETURN;
    END CATCH
END

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    好的,您必须在Else 语句中使用BeginEnd,因为它包含多行代码。

        IF @Code = 'KP'
            SET @stringConcat += 'Y';
        ELSE IF @Code = 'RL'
            SET @stringConcat += 'Z';
        ElSE
        Begin
            -- Return error code and stop processing
            SELECT -1;
            RETURN;
        End
    

    【讨论】:

      【解决方案2】:

      你的缩进是在骗你。

      IF @Code = 'KP'
           SET @stringConcat += 'Y';
       ELSE IF @Code = 'RL'
           SET @stringConcat += 'Z';
       ElSE
           -- Return error code and stop processing
           SELECT -1;  -- THIS is evaluated as the ELSE
           RETURN;     -- THIS is run regardless.
      

      只有最后一个 ELSE 之后的第一行将作为 ELSE 条件执行。无论如何,该 RETURN 都会运行。无法访问您的 BEGIN TRY。

      试试这个:

      IF @Code = 'KP'
           SET @stringConcat += 'Y';
       ELSE IF @Code = 'RL'
           SET @stringConcat += 'Z';
       ElSE
           BEGIN
           -- Return error code and stop processing
           SELECT -1;
           RETURN;
           END
      

      【讨论】:

        【解决方案3】:

        如果您希望 SELECT -1RETURN 都位于 ELSE 内,则必须使用 BEGIN / END 块。现在只有 SELECT -1 在 else 分支内。

        所以你需要

        ELSE
          BEGIN
            SELECT -1;
            RETURN;
          END
        

        【讨论】:

          【解决方案4】:

          If, ELSE IF, ELSE 中的最后一个ELSE 包含多行代码。您需要以BEGIN 开头并以END 结尾。有关详细信息,请参阅此MSDN documentation

          IF @Code = 'KP'
              SET @stringConcat += 'Y';
          ELSE IF @Code = 'RL'
              SET @stringConcat += 'Z';
          ElSE
              BEGIN
                  -- Return error code and stop processing
                  SELECT -1;
                  RETURN;
              END
          

          【讨论】:

            【解决方案5】:

            在您的情况下(双关语),您最好使用CASE WHEN 构造,因为您想为@Code 变量评估不同的值。 MSDN 声明CASE 正是针对这种情况而设计的:

            Evaluates a list of conditions and returns one of multiple possible result expressions.
            

            我发现它使代码对于简单的评估更具可读性(但这很可能是个人喜好)。

            您的代码最终会看起来与此类似(伪代码。未经测试):

            CASE @Code 
                WHEN 'KP' THEN SET @stringConcat += 'Y';
                WHEN 'RL' THEN SET @stringConcat += 'Z';
                ElSE
                    -- Return error code and stop processing
                    SELECT -1;
                    RETURN;
            END 
            

            更多关于CASE的声明在这里:

            https://msdn.microsoft.com/en-us/library/ms181765.aspx

            【讨论】:

              【解决方案6】:

              在您的示例中,RETURN 始终运行。

              根据编码实践标准,在我看来,您应该始终在 SQL 中使用 BEGIN 和 END 来清楚地说明逻辑块中的预期内容。我更喜欢 C# 中的相同模式,即使在不需要时也使用大括号。在我看来,缩进很重要,它可以让您轻松跟踪它的开始和结束位置。

              IF(1=2)
                 BEGIN
                    SELECT 1
                 END
              SELECT 2
              
              IF(1=2) SELECT 1
                 SELECT 2
              

              这些在行为上是等效的,但第一个清楚地表明 SELECT 1 依赖于它上面的逻辑条件。

              你真正想要的是:

              IF @Code = 'KP'
                  BEGIN
                      SET @stringConcat += 'Y';
                  END
              ELSE IF @Code = 'RL'
                  BEGIN
                      SET @stringConcat += 'Z';
                  END
              ElSE
                  BEGIN
                      -- Return error code and stop processing
                      SELECT -1;
                      RETURN;
                  END
              

              【讨论】:

                猜你喜欢
                • 2012-05-11
                • 2021-07-25
                • 1970-01-01
                • 2021-03-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多