#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