сервер mssql — неправильный синтаксис рядом с ключевым словом ‘ELSE’

#sql #sql-server #if-statement

#sql #sql-сервер #if-оператор

Вопрос:

У меня проблема с функцией ELSE

Вот мой код:

 DECLARE @a AS int = 2;
DECLARE @b AS int = 4;
DECLARE @c AS int = 1;
DECLARE @delta AS int;
DECLARE @x0 AS int;
DECLARE @x1 AS int;
DECLARE @x2 AS int;

BEGIN
    SET @delta = POWER(@b, 2) - 4 * @a * @c
            IF @delta > 0
                SET @x1 = -@b - SQRT(@delta) / 2 * @a
                SET @x2 = -@b   SQRT(@delta) / 2 * @a
                PRINT 'Delta equals: '   CAST(@delta AS varchar)   'x1: '   CAST(@x1 AS varchar)   'x2: '   CAST(@x2 AS varchar);
            ELSE IF @delta = 0
                SET @x0 = -@b / 2 * @a
                PRINT 'Delta equals: '   CAST(@delta AS varchar)   'x0: '   CAST(@x0 AS varchar);
            ELSE
END
 

Ошибки, которые я получаю:

Сообщение 156, уровень 15, состояние 1, строка 15 Неправильный синтаксис рядом с ключевым словом ‘ELSE’.

Сообщение 156, уровень 15, состояние 1, строка 18 Неправильный синтаксис рядом с ключевым словом ‘ELSE’.

Комментарии:

1. После ELSE . Это выглядит довольно очевидно.

2. Вам также нужно использовать BEGIN и END немного больше. IF ELSE операторы and влияют только на следующий непосредственно за оператором оператор, если вы не используете BEGIN ... END блок, например: IF ... BEGIN ... END ELSE BEGIN ... END .

Ответ №1:

У вас явно есть висячее ELSE предложение и отсутствует BEGIN / END .

Однако я хочу предостеречь вас от использования varchar (или любого строкового объявления) в SQL Server без длины. Длина зависит от контекста, и отсутствие длины часто является ошибкой, которая только и ждет, чтобы произойти.

Самое простое решение — использовать CONCAT() :

 BEGIN
    SET @delta = POWER(@b, 2) - 4 * @a * @c;
    IF @delta > 0
    BEGIN
        SET @x1 = -@b - SQRT(@delta) / 2 * @a;
        SET @x2 = -@b   SQRT(@delta) / 2 * @a;
        PRINT CONCAT('Delta equals: ', @delta, 'x1: ', @x1, 'x2: ', @x2);
    END;
    ELSE IF @delta = 0
    BEGIN
        SET @x0 = -@b / 2 * @a;
        PRINT CONCAT('Delta equals: ', @delta, 'x0: ', @x0);
    END;
END;
 

CONCAT() автоматически преобразует значения в строки для конкатенации.

Ответ №2:

У вас не может быть пустого ELSE , и если у вас есть несколько операторов, вам нужно использовать BEGIN / END :

 IF @delta > 0
    BEGIN
        SET @x1 = -@b - SQRT(@delta) / 2 * @a
        SET @x2 = -@b   SQRT(@delta) / 2 * @a
        PRINT 'Delta equals: '   CAST(@delta AS varchar)   'x1: '   CAST(@x1 AS varchar)   'x2: '   CAST(@x2 AS varchar);
    END
ELSE IF @delta = 0
    BEGIN
        SET @x0 = -@b / 2 * @a
        PRINT 'Delta equals: '   CAST(@delta AS varchar)   'x0: '   CAST(@x0 AS varchar);
    END
 

Ответ №3:

Я думаю, что нужный вам синтаксис:

 DECLARE @a AS int = 2;
DECLARE @b AS int = 4;
DECLARE @c AS int = 1;
DECLARE @delta AS int;
DECLARE @x0 AS int;
DECLARE @x1 AS int;
DECLARE @x2 AS int;


SET @delta = POWER(@b, 2) - 4 * @a * @c;
IF @delta > 0
BEGIN
    SET @x1 = -@b - SQRT(@delta) / 2 * @a;
    SET @x2 = -@b   SQRT(@delta) / 2 * @a;
    PRINT 'Delta equals: '   CAST(@delta AS varchar)   'x1: '   CAST(@x1 AS varchar)   'x2: '   CAST(@x2 AS varchar);
END
ELSE IF @delta = 0
BEGIN
    SET @x0 = -@b / 2 * @a;
    PRINT 'Delta equals: '   CAST(@delta AS varchar)   'x0: '   CAST(@x0 AS varchar);
END
 

Обоснование:

  • завершающий ELSE текст необходимо удалить
  • блоки, содержащие несколько инструкций, требуют BEGIN и END
  • окружение BEGIN/END не требуется