2013-04-08 209 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