T-SQL如何结束IF-ELSE IF-ELSE块

时间:2015-09-16 17:17:28

标签: sql-server tsql

当我使用正确的参数运行以下过程以便不返回-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

6 个答案:

答案 0 :(得分:19)

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

    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

答案 1 :(得分:6)

你的缩进对你说谎。

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将无论如何都会运行。无法接触你的开始。

试试这个:

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 :(得分:4)

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

所以你需要

ELSE
  BEGIN
    SELECT -1;
    RETURN;
  END

答案 3 :(得分:3)

If,ELSE IF中的最后一个ELSE,ELSE包含多行代码。您需要使用BEGIN启动它并以END结束。有关详细信息,请参阅此*

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

答案 4 :(得分:2)

在你的情况下(双关语),你可能最好使用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

答案 5 :(得分:1)

在您的示例中,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