2016-10-21 5 views
0

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

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 

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

Msg 156, Level 15, State 1, Procedure spRecordPayment, Line 21 Incorrect syntax near the keyword 'ELSE'.

+2

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

+0

Эй, извините, я заметил, что я оставил это вне @ rory.ap –

ответ

1

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

IF (...) 
    BEGIN 
    .... 
    END 
ELSE 
    BEGIN 
    .... 
    END 
+0

Чтобы добавить к этому, после того, как условие «BOOLEAN» проверено, выполняется инструкция TSQL или группировка операторов, но если вы используя группировку операторов, вы должны использовать блок операторов с 'BEGIN' и' END'. Поскольку у вас, @DanielStallard, есть несколько операторов в вашем заявлении 'IF/ELSE' ... вам нужно использовать' BEGIN/END', как сказал Рори. – scsimon

+0

Я понял, но спасибо за помощь. –

0

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

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