2013-04-08 203 views
0

我寫過這個存儲過程,它執行但不更新客戶。問題是:創建一個名爲prc_cus_balance_update的過程,將發票號碼作爲參數並更新客戶餘額。SQL Server的存儲過程

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

幾點建議:你是否在某處進行了提交?從發票中選擇獲取客戶代碼是否返回多行? cus_balance null(null + 5)是否爲空。 – 2013-04-08 13:49:38

+0

我從來沒有想過它返回多行。謝謝! – user2257844 2013-04-08 13:54:50

+0

更新客戶 SET CUS_BALANCE = ISNULL(CUS_BALANCE,0)+ ISNULL((SELECT SUM(INV_TOTAL)從發票開WHERE @ INV_NUMBER = INV_NUMBER),0) WHERE @ CUS_CODE = CUS_CODE – bummi 2013-04-08 13:58:41

回答

0

在開發過程中,我會加入一些「額外」來弄清楚發生了什麼。

下面的僞代碼。

您想確保找到了匹配的行。 並且您想確保至少有一行實際上已更新。

我不是說下面的代碼是「生產就緒」。但會顯示這些概念。

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 
0

嘗試把一些更好的防彈。多種行,空值,等等,都可以導致問題與你當前如何擁有它。這裏有一個刺戳,沒有我知道你的數據模型的具體細節(把發票總數彙總在一起可能不合適,我只是說你可以有多行並需要處理)。

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 
     [email protected]_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