2012-02-18 71 views
3

我试图找出一种方法来创建一个从数据库中删除发票的存储过程。存储过程(删除发票)

三表会受到影响:

  • 发票 - 包含InvoiceID,日期和客户ID(FK)
  • INVOICELINE - 包含InvoicelineID,InvoiceID(FK),条款ArticleID(FK),数量,价格和折扣
  • 文章 - 包含文章名称,数量,价格和折扣的文章。

    这就是我想要的:

    1. 你叫一个参数的SP,InvoiceID
    2. 对发票行项目的数量增加回款表,该项目的数量。
    3. 所有发票上的发票行被删除
    4. 发票被删除

下面是我到目前为止,这是一个要删除发票行一个SP。我想从称为DeleteInvoice的SP调用此SP。问题是,我无法弄清楚SP应该如何设计才能完成这项工作,例如,如何循环通过发票上的发票行?如果有人能在这里帮忙,会很高兴。

删除发票行的SP(应该从被删除发票中的SP被调用,次数,因为有发票行):

@InvoiceID int 
AS 
BEGIN 
    DECLARE @Articleid int, @Quantity int 
    SELECT @Articleid = ArticleID, @Quantity=Quantity 
    FROM InvoiceLine 
    WHERE [email protected] 

    BEGIN TRY 
     BEGIN TRAN 
      UPDATE Article SET [email protected] 
      WHERE [email protected]; 

      DELETE FROM InvoiceLine 
      WHERE [email protected]; 
     COMMIT TRAN 
    END TRY 

    BEGIN CATCH 
     ROLLBACK TRAN 
     RAISERROR ('Couldn't delete the invoice line!',16,1) 
    END CATCH 
END 
+0

Loopy思考不会让您在SQL中走得太远。 SQL旨在处理集合操作,例如更新发票中的所有订单项。这与大多数程序语言是截然不同的。 – HABO 2012-02-18 15:07:15

回答

2

我假设你有意砍掉CREATE/ALTER PROCEDURE行前@InvoiceID声明。您可以在交易中使用三条语句来执行此操作 - 无需多个过程或循环:

@InvoiceID int 
AS 
BEGIN 
    BEGIN TRY 
    BEGIN TRANSACTION; 

    -- This reclaims inventory to the Article table 
    WITH R AS (
     SELECT ArticleID, SUM(Quantity) ReclaimedQuantity 
     FROM InvoiceLine 
     WHERE InvoiceID = @InvoiceID 
     GROUP BY ArticleID 
    ) 
    UPDATE Article 
    SET Quantity = Quantity + R.ReclaimedQuantity 
    FROM Article INNER JOIN 
     R ON Article.ArticleID = R.ArticleID; 

    -- Removes invoice line items 
    DELETE FROM InvoiceLine 
    WHERE InvoiceID = @InvoiceID; 

    -- Removes the invoice header item 
    DELETE FROM Invoice 
    WHERE InvoiceID = @InvoiceID; 

    COMMIT TRANSACTION; 
    END TRY 
    BEGIN CATCH 
    ROLLBACK TRANSACTION; 
    END CATCH 
END 
+0

谢谢,作品像魅力! :) – holyredbeard 2012-02-18 17:30:02