【问题标题】:Keyword 'ELSE' keeps causing incorrect syntax关键字“ELSE”不断导致语法错误
【发布时间】:2021-12-17 12:48:06
【问题描述】:

我正在为这个 else 函数而苦苦挣扎。

我一直在第 41 行收到此错误消息:

消息 156,第 15 级,状态 1,第 41 行
关键字“ELSE”附近的语法不正确

我知道其他人已经问过类似的问题。除了在这种情况下(如果我错了,请纠正我),有人告诉我,一些 IF 语句仍然可以在最后没有 ELSE 语句的情况下运行。最后一个 ELSE 语句应该是第一个条件不为真的结果。

这是我的代码:

USE PR;

DECLARE @TotHours decimal;
DECLARE @TotEmps int;
DECLARE @HolHours decimal;
DECLARE @RegHours decimal;
DECLARE @OTHours time;

SELECT @TotHours = SUM(WorkHours)
FROM Hours
WHERE PPID IN (SELECT MAX(PPID) FROM PayPeriod);

SELECT @TotEmps = COUNT(EmpID) FROM EmpData;

SELECT @HolHours = SUM(HolHours)
FROM Hours
WHERE PPID IN (SELECT MAX(PPID) FROM PayPeriod);

SET @RegHours = @TotEmps * 32;

IF @OTHours = @HolHours
BEGIN
    SELECT *
    FROM Hours           
    WHERE @OTHours > 0; 
END;

IF @RegHours > @TotHours
BEGIN
    SELECT *
    FROM Hours
    WHERE @OTHours = @HolHours AND @RegHours = @TotEmps * 32;

    PRINT 'Total regular hours for the week: ' + CONVERT(varchar, @RegHours, 1);
    PRINT 'Total holiday hours for the week: ' + CONVERT(varchar, @HolHours, 1);
    PRINT 'Total OT Hours for the week: ' + CONVERT(varchar, @OTHours, 1);
END;
ELSE
BEGIN
    SELECT @TOtHours - MAX(@RegHours) AS OTHours
    FROM Hours;

    PRINT 'Total regular hours for the week: ' + CONVERT(varchar, @RegHours, 1);
    PRINT 'Total holiday hours for the week: ' + CONVERT(varchar, @HolHours, 1);
    PRINT 'Total OT Hours for the week: ' + CONVERT(varchar, @OTHours, 1);
END;
ELSE
    PRINT 'This week had no holiday pay.';

【问题讨论】:

  • 你必须在END之后有no;,然后ELSE才会跟随......
  • 你的嵌套没有意义。您实际上拥有 IF ... ELSE ... ELSE ,这是无效的。
  • 类似“END no;”之类的?
  • 我在 IF 语句的末尾添加了一个额外的 ELSE,但我仍然遇到同样的问题。
  • 一个IF只能有一个ELSE。要创建一个多分支,您基本上将另一个 IF 放在 ELSE 分支中,例如END; ELSE IF Condition BEGIN ...

标签: sql sql-server sql-server-2012


【解决方案1】:

您的第一个 END 放错了位置。

你想要

USE PR;

DECLARE @TotHours decimal;
DECLARE @TotEmps int;
DECLARE @HolHours decimal;
DECLARE @RegHours decimal;
DECLARE @OTHours time;

SELECT @TotHours = SUM(WorkHours)
FROM Hours
WHERE PPID IN (SELECT MAX(PPID) FROM PayPeriod);

SELECT @TotEmps = COUNT(EmpID) FROM EmpData;

SELECT @HolHours = SUM(HolHours)
FROM Hours
WHERE PPID IN (SELECT MAX(PPID) FROM PayPeriod);

SET @RegHours = @TotEmps * 32;

IF @OTHours = @HolHours
BEGIN
    SELECT *
    FROM Hours           
    WHERE @OTHours > 0; 
    --not here

    IF @RegHours > @TotHours
    BEGIN
        SELECT *
        FROM Hours
        WHERE @OTHours = @HolHours AND @RegHours = @TotEmps * 32;

        PRINT 'Total regular hours for the week: ' + CONVERT(varchar, @RegHours, 1);
        PRINT 'Total holiday hours for the week: ' + CONVERT(varchar, @HolHours, 1);
        PRINT 'Total OT Hours for the week: ' + CONVERT(varchar, @OTHours, 1);
    END;
    ELSE
    BEGIN
        SELECT @TOtHours - MAX(@RegHours) AS OTHours
        FROM Hours;

        PRINT 'Total regular hours for the week: ' + CONVERT(varchar, @RegHours, 1);
        PRINT 'Total holiday hours for the week: ' + CONVERT(varchar, @HolHours, 1);
        PRINT 'Total OT Hours for the week: ' + CONVERT(varchar, @OTHours, 1);
    END;
END;-- HERE
ELSE
    PRINT 'This week had no holiday pay.';

良好的代码格式有助于发现此类错误

【讨论】:

  • 我明白了。由于最后一个 ELSE 连接到第一个 IF,所以最后一个 END 也必须跟在第一个 BEGIN 上。
【解决方案2】:

IF ELSE END 语句中的问题 您没有正确应用 IF ELSE 条件

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多