2012-02-21 2 views
0

Ниже приведена хранимая процедура для удаления счета-фактуры. Счет-фактура содержит одну или несколько строк счета-фактуры, а строка счета-фактуры содержит или больше статьи.Ошибка в хранимой процедуре, но где?

Вот как это работает:

  1. Число статей по линии счета-фактуры обновляется в таблице статей (количество).
  2. Линия счетов удаляется
  3. Счетов удаляются

В следующих таблицах затронуты:

  • СЧЕТ - Содержит 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
+3

Какое сообщение об ошибке? – Taryn

+0

Какая ошибка вы получаете? Я знаю, что ваши блоки try/catch не позволят вам это увидеть, поэтому вы можете попробовать запустить его без этих блоков, чтобы получить полное сообщение об ошибке. – TimothyAWiseman

+0

Итак, все подробности о том, что хранит процедура, но не одно слово о том, что на самом деле происходит не так? –

ответ

1

Посмотрите на спусковой крючок, который ИНКО правильно написанный для обработки только одной записи за раз.

Смежные вопросы