2013-04-08 7 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) равно null. –

+0

Я даже не думал об этом, возвращая более одного ряда. Благодаря! – user2257844

+0

UPDATE КЛИЕНТ SET CUS_BALANCE = ISNULL (CUS_BALANCE, 0) + ISNULL ((SELECT SUM (INV_TOTAL) FROM ФАКТУРЫ WHERE @ INV_NUMBER = INV_NUMBER), 0) ГДЕ @ CUS_CODE = CUS_CODE – bummi

ответ

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 

 Смежные вопросы

  • Нет связанных вопросов^_^