0

このストアド プロシージャを作成しましたが、実行されますが、顧客は更新されません。問題は、請求書番号をパラメーターとして取り、顧客の残高を更新する prc_cus_balance_update という名前のプロシージャーを作成することです。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE PRC_CUS_BALANCE_UPDATE3 

    @INV_NUMBER INT 

AS

BEGIN

    DECLARE @CUS_CODE INT

    SELECT @CUS_CODE=CUS_CODE
    FROM INVOICE
    WHERE @INV_NUMBER=INV_NUMBER

    UPDATE CUSTOMER
    SET CUS_BALANCE=CUS_BALANCE + 
        (SELECT INV_TOTAL FROM INVOICE WHERE @INV_NUMBER=INV_NUMBER)
    WHERE @CUS_CODE=CUS_CODE

END
GO
4

2 に答える 2

0

複数の行、null 値などはすべて、現在の方法に問題を引き起こす可能性があります。データモデルの詳細を知らずに、これを突き刺します(請求書の合計を合計するのは適切ではないかもしれません。複数の行があり、それに対処する必要があると言っているだけです)。

CREATE PROCEDURE PRC_CUS_BALANCE_UPDATE3 
    @INV_NUMBER INT 
AS
BEGIN

    DECLARE @CUS_CODE INT

    SELECT 
        TOP 1 @CUS_CODE = CUS_CODE
    FROM 
        INVOICE
    WHERE 
        INV_NUMBER=@INV_NUMBER

    IF @CUS_CODE IS NOT NULL
    BEGIN
        UPDATE 
            CUSTOMER
        SET 
            CUS_BALANCE = ISNULL(CUS_BALANCE, 0.0) + 
            ISNULL(
                (SELECT 
                    SUM(INV_TOTAL) 
                FROM 
                    INVOICE 
                WHERE 
                    @INV_NUMBER = INV_NUMBER), 
            0.0)
        WHERE 
            CUS_CODE = @CUS_CODE    
    END
END
GO
于 2013-04-08T18:20:51.277 に答える
0

開発中に、何が起こっているのかを把握するためにいくつかの「エクストラ」を入れました。

以下の疑似コード。

一致する行が見つかったことを確認する必要があります。そして、少なくとも 1 つの行が実際に更新されたことを確認します。

以下のコードが「生産準備完了」であると言っているわけではありません。しかし、概念を示します。

CREATE PROCEDURE PRC_CUS_BALANCE_UPDATE3 

    @INV_NUMBER INT 

AS

BEGIN

    DECLARE @CUS_CODE INT
    DECLARE @MYROWCOUNT INT

    SELECT @CUS_CODE=CUS_CODE
    FROM INVOICE
    WHERE @INV_NUMBER=INV_NUMBER

    if(Not(@CUS_CODE IS NULL))
        BEGIN

        SET NOCOUNT OFF

        UPDATE CUSTOMER
        SET CUS_BALANCE=CUS_BALANCE + 
            (SELECT INV_TOTAL FROM INVOICE WHERE @INV_NUMBER=INV_NUMBER)
        WHERE @CUS_CODE=CUS_CODE


        select @MYROWCOUNT = @@ROWCOUNT

        if(@MYROWCOUNT <=0)
            BEGIN
                print 'No row updated.    :<'
            END


        SET NOCOUNT OFF


        END
    ELSE
        BEGIN
            print "@CUS_CODE match not found."
        END

END
GO
于 2013-04-08T15:24:16.117 に答える