#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
не требуется