2012-02-18 8 views
3

私は、dbから請求書を削除するためのストアドプロシージャを作成する方法を理解しようとしています。ストアドプロシージャ(請求書の削除)

3つのテーブルに影響される:

  • INVOICE - InvoiceID、日付と得意先(FK)
  • INVOICELINEが含まれていますが - InvoicelineID、InvoiceID(FK)、情報でarticleID(FK)、数量、価格およびディスカウント
  • が含まれています
  • 記事 - Articlename、Quantity、Price、Discountの記事を含みます。

    これは私が欲しいものです:

    1. あなたは一つの引数でSPを呼び出して、請求書のライン上のアイテムの数は、その項目の数量に戻って記事のテーブルに追加され
    2. をInvoiceID 。請求書上の
    3. すべての請求書のラインが
    4. 削除された請求書は、以下の

削除された請求書の行を削除するためのSPである、私がこれまで持っているものです。私は、このSPをDeleteInvoiceという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

ルーピーな思考はあなたをSQLに近づけません。 SQLはセット操作に対処するように設計されています。請求書内のすべての明細を更新します。ほとんどの手続き型言語とは非常に異なるハンマーです。 – HABO

答えて

2

を、私はあなたが意図的に切り落とさと仮定しています@InvoiceID宣言の前にCREATE/ALTER PROCEDURE行を入力してください。トランザクション内の3つのステートメントでこれを行うことができます。複数のプロシージャまたはループを必要とせずに実行できます。

@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