Почему мой параметр ELSE выдает ОШИБКУ?

#sql-server-2012

#sql-server-2012

Вопрос:

Я пытаюсь создать хранимую процедуру.Процедура должна принимать два параметра: идентификатор счета и сумму платежа. Обновите эту запись, чтобы добавить этот платеж к общей сумме и записать дату платежа как сегодняшнюю.Это код, который я использую этот код.Если видны какие-либо другие ошибки, пожалуйста, укажите на них.

 USE AP;
IF OBJECT_ID ('spRecordPayment') IS NOT NULL
DROP PROC spRecordPayment;
GO

CREATE PROCEDURE spRecordPayment
 @InvoiceID int,
 @PaymentAmount money
AS

BEGIN
SELECT InvoiceId,InvoiceTotal
FROM Invocies
WHERE InvoiceId = @InvoiceID
    IF @PaymentAmount > InvoiceTotal
        DECLARE @CreditTotal MONEY;
        SET @CreditTotal = @PaymentAmount - InvoiceTotal;

        UPDATE Invoices
        SET CreditTotal = @CreditTotal
        WHERE InvoiceID = @InvoiceID;

        UPDATE Invoices
        SET PaymentDate = GETDATE()
    ELSE --This is Line 21

     DECLARE @CreditTotal2 MONEY;
     SET @CreditTotal2 = InvoiceTotal - @PaymentAmount;

     UPDATE Invoices
     SET CreditTotal = @CreditTotal2
     WHERE InvoiceID = @InvoiceID;

     UPDATE Invoices
     SET PaymentDate = GETDATE()
END
  

Это выдает мне эту ошибку:

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

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

1. Вы собираетесь заставить нас угадать, что это за сообщение об ошибке, которое вы получаете? Мой хрустальный шар сломан…

2. Привет, извини, я заметил, что пропустил это @rory.ap

Ответ №1:

Я полагаю, ваша проблема в том, что у вас нет никаких BEGIN...END блоков:

 IF (...)
    BEGIN
    ....
    END
ELSE
    BEGIN
    ....
    END
  

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

1. В дополнение к этому, после проверки BOOLEAN условия выполняется инструкция TSQL или группировка инструкций — но если вы используете группировку инструкций, вы должны использовать блок инструкций с BEGIN и END . Поскольку у вас, @DanielStallard, в вашем IF / ELSE заявлении есть несколько операторов… вам нужно использовать BEGIN / END , как заявил Рори.

Ответ №2:

Ответ, который я использовал, был:

  USE AP;
 IF OBJECT_ID ('spRecordPayment') IS NOT NULL
 DROP PROC spSumInvoices;
 GO

CREATE PROC spRecordPayment 
@InvoiceID int,
@PaymentAmount money
AS

BEGIN
SELECT InvoiceId,InvoiceTotal
FROM Invoices
WHERE InvoiceId = @InvoiceID
IF @PaymentAmount > (SELECT InvoiceTotal From Invoices Where InvoiceId = @InvoiceID)
Begin
        DECLARE @CreditTotal MONEY;
        SET @CreditTotal = @PaymentAmount - (SELECT InvoiceTotal From
    Invoices Where InvoiceId = @InvoiceID);

    UPDATE Invoices
    SET InvoiceTotal = 0
    WHERE InvoiceID = @InvoiceID;

    UPDATE Invoices
    SET PaymentTotal = @PaymentAmount
    WHERE InvoiceID = @InvoiceID;

    UPDATE Invoices
    SET CreditTotal = @CreditTotal
    WHERE InvoiceID = @InvoiceID;

    UPDATE Invoices
    SET PaymentDate = GETDATE()
    WHERE InvoiceID = @InvoiceID;
End
ELSE
Begin
 DECLARE @NewTotal MONEY;
 SET @NewTotal = (SELECT InvoiceTotal From Invoices Where
 InvoiceId            = @InvoiceID) - @PaymentAmount;

    UPDATE Invoices
    SET CreditTotal = 0
    WHERE InvoiceID = @InvoiceID;

    UPDATE Invoices
    SET PaymentDate = GETDATE()
    WHERE InvoiceID = @InvoiceID;

    UPDATE Invoices
    SET InvoiceTotal = @NewTotal
    WHERE InvoiceID = @InvoiceID;
End