Ниже приведена хранимая процедура для удаления счета-фактуры. Счет-фактура содержит одну или несколько строк счета-фактуры, а строка счета-фактуры содержит или больше статьи.Ошибка в хранимой процедуре, но где?
Вот как это работает:
- Число статей по линии счета-фактуры обновляется в таблице статей (количество).
- Линия счетов удаляется
- Счетов удаляются
В следующих таблицах затронуты:
- СЧЕТ - Содержит InvoiceID, Дату, PaymentTerms и КодКлиент (Fk) < --- ------- содержит счет-фактуру с InvoiceID 8
- INVOICELINE - Содержит InvoicelineID, InvoiceID (fk), ArticleID (fk), Количество, цена и скидка
- СТАТЬЯ. Содержит предметы с артикулом, количеством, стоимостью и скидкой.
Ниже приведено SP, но по какой-то странной причине я получаю сообщение об ошибке при его запуске (счет, который я пытаюсь удалить, конечно существует). Кто-нибудь может понять, что с ним не так?
Заранее спасибо!
ALTER PROCEDURE usp_DeleteInvoice
@InvoiceID int
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
WITH fr AS (
SELECT ArticleID, SUM(Quantity) AS ReclaimedQuantity
FROM Invoiceline
WHERE InvoiceID = @InvoiceID
GROUP BY ArticleID
)
UPDATE Article
SET Quantity = Quantity + fr.ReclaimedQuantity
FROM Article INNER JOIN
fr ON Article.ArticleID = fr.ArticleID;
DELETE FROM Invoiceline
WHERE InvoiceID = @InvoiceID;
DELETE FROM Invoice
WHERE InvoiceID = @InvoiceID; <- Error here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
RAISERROR ('Couldn't delete invoice!',16,1)
END CATCH
END
GO
EXEC usp_DeleteInvoice 8
EDIT: я получаю следующее сообщение об ошибке (строка 36 = где InvoiceID = @InvoiceID;):
- подзапрос возвращает более чем на 1 значение. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение.
Вот структуру таблицы счетов (номера от одного из счетов-фактур, которые существуют):
- Invoice ID (PK, Int): 7
- Дата (дата): 2011- 01-01
- PaymentTerms (TinyInt) 30
- CustomerID: 1
Какое сообщение об ошибке? – Taryn
Какая ошибка вы получаете? Я знаю, что ваши блоки try/catch не позволят вам это увидеть, поэтому вы можете попробовать запустить его без этих блоков, чтобы получить полное сообщение об ошибке. – TimothyAWiseman
Итак, все подробности о том, что хранит процедура, но не одно слово о том, что на самом деле происходит не так? –