【问题标题】:Stored procedures (delete invoice)存储过程(删除发票)
【发布时间】:2012-02-18 22:24:44
【问题描述】:

我正在尝试找出一种方法来创建用于从数据库中删除发票的存储过程。

三个表受到影响:

  • INVOICE - 包含 InvoiceID、Date 和 CustomerID (fk)
  • INVOICELINE - 包含 InvoicelineID、InvoiceID (fk)、ArticleID (fk)、数量、价格和折扣
  • ARTICLE - 包含带有文章名称、数量、价格和折扣的文章。

    这就是我想要的:

    1. 您使用一个参数 InvoiceID 调用 SP
    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 InvoiceID=@InvoiceID

    BEGIN TRY
        BEGIN TRAN
            UPDATE Article SET Quantity=Quantity+@Quantity
            WHERE ArtikelID=@Articleid;

            DELETE FROM InvoiceLine
            WHERE InvoiceLineID=@InvoiceLineID;
        COMMIT TRAN
    END TRY

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

【问题讨论】:

  • 循环思维不会让您在 SQL 中走得更远。 SQL 旨在处理集合操作,例如更新发票中的所有行项目。它与大多数程序语言截然不同。

标签: sql sql-server stored-procedures


【解决方案1】:

我假设您在 @InvoiceID 声明之前故意切断了 CREATE/ALTER PROCEDURE 行。您可以在一个事务中使用三个语句来执行此操作 - 无需多个过程或循环:

@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-10
    • 2014-03-22
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多