Member 12770648 Ответов: 1

Вызываемая хранимая процедура запускается и обновляет таблицу 2 раза вместо одного раза


Вызов хранимой процедуры
--------------------------

ЕСЛИ @ZEQUALPAY= 'ПРОСТОЙ'
НАЧАТЬ

В то время как @STARTPERIOD<=@ENDPERIOD
НАЧАТЬ

SET @CMONTH = @ZPERIOD
SET @CYEAR = @ZYEAR

Набор @начальный период: = конвертировать(тип nvarchar,@ZCCYR)+ права('00' + конвертировать(тип varchar(10),@ZCCMTH), 2)

EXEC [dbo].[sp_simple] @ZIDNO,@ZLOANUMBER,@CMONTH,@CYEAR,@RETURN

ЕСЛИ @ZPERIOD = 12
НАЧАТЬ
SET @ZCCMTH = 1
SET @ZCCYR = @ZYEAR+1
КОНЕЦ
ЕЩЁ
Если @ZPERIOD < & gt; 12
НАЧАТЬ
SET @ZCCMTH =@ZPERIOD+1
SET @ZCCYR =@ZYEAR
КОНЕЦ

SET @ZPERIOD = @ZCCMTH
SET @ZYEAR = @ZCCYR

Набор @начальный период: = конвертировать(тип nvarchar,@ZCCYR)+ права('00' + конвертировать(тип varchar(10),@ZCCMTH), 2)


КОНЕЦ
КОНЕЦ














Вызываемая Хранимая Процедура
------------------------
------------------------
ALTER PROCEDURE [dbo].[sp_simple]
	(
	@ZIDNO          Varchar(20),
	@ZLOANUMBER     Varchar(20),
	@CMONTH         Int,
	@CYEAR          Int,
	@RETURN		   varchar(4) OUTPUT     
	)
	AS

	BEGIN

	DECLARE @AIDNO       varchar(20),
	@ALOANTYPE   varchar(20),
	@ADEDUCT     money,
	@ATERM_START DECIMAL(22,10),
	@ACCNT       smallint ,
	@BINT_NO     varchar(20),
	@BINT_NAME   varchar(50),
	@BRATES     DECIMAL(22,10)
  
	SELECT @AIDNO    = A.IDNO        ,
	@ALOANTYPE      =  A.LOANTYPE   ,
	@ADEDUCT        =  A.DEDUCT     ,
	@AOUTSTAND      =  A.OUTSTAND   ,
	@ACOMPCOUNT     =  A.COMPCOUNT  ,
	@AINT_NO        =  A.INT_NO     ,
	@ACCNT          =  A.CCNT       ,
	@ASACCRUED      =  A.SACCRUED ,
	@ANUMDAYS       =  A.NUMDAYS  ,
	@BINT_NO         =  B.INT_NO   ,
	@BINT_NAME       =  B.INT_NAME   ,
	@BRATES          =  B.RATES
	FROM LOANS A JOIN INTEREST B
	ON A.INT_NO = B.INT_NO WHERE  REPAY_MODE='SIMPLE INTEREST' AND COMPCOUNT>=1
	AND A.IDNO=@ZIDNO AND A.LOANUMBER=@ZLOANUMBER
  
		 
	SET @ACCNT = @ACCNT+1	
		
		
		IF @APAY_TYPE  ='MONTHLY'
		BEGIN		
		
		IF @AMORAT_MTHS=0 AND @AMORATORIUM=0 AND @ACCNT <=@ATERM_START


Проблема
--------
@РЕЗУЛЬТАТЫ

1. Да


значение

1. 0

Программа работает вперед, следовательно, расчет

SET @ACCNT = @ACCNT+1

делается около три раза прежде чем будет достигнуто приведенное ниже условие,
тем самым побеждая условие.


SET @ACCNT в 0 со стола, как бы то ни было, прежде чем он попадет туда, где
условие для его проверки это чтение 3.



Если @AMORAT_MTHS=0 и @AMORATORIUM=0 и @ACCNT <=@ATERM_START


Как мне справиться с @RETURN, чтобы поток программы был упорядоченным?


Спасибо

Что я уже пробовал:

Примеров нет. Это своеобразная проблема

Richard Deeming

WHILE @STARTPERIOD <= @ENDPERIOD
BEGIN 
    SET @CMONTH = @ZPERIOD      
    SET @CYEAR  = @ZYEAR  
    EXEC [dbo].[sp_simple] @ZIDNO, @ZLOANUMBER, @CMONTH, @CYEAR, @RETURN
END


Так как Вы тоже никогда не обновляетесь @STARTPERIOD или @ENDPERIOD в этой петле, как вы ожидаете, что он остановится?

Member 12770648

Его обновили я его не включил

1 Ответов

Рейтинг:
0

Sandeep1003

WHILE @STARTPERIOD<=@ENDPERIOD


бегу два раза