Mohammed Asarudeen R Ответов: 1

Вложенный цикл while в хранимых процедурах


Я просто обновляю недостающие записи в существующей таблице.

Я пробую вложенный цикл While, в то время как внутренний цикл работает хорошо
но внешняя петля не работает для меня. Я проверял много раз, для меня это кажется правильным. Где я ошибся, пожалуйста, разберитесь друзья .

заранее спасибо

[edit]код с отступом вручную-OriginalGriff [/edit]

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

Alter Procedure spExemptedLeaveSettings
As
Begin
    Declare @iLeaveID int = 1 
    Declare @iSMID int = 1133
    Declare @cSex varchar
    Set @cSex = (Select cSex from StaffMaster where iSMID = @iSMID) 
    While(@iSMID <= 1662)
    Begin  
        While(@iLeaveID <= 15)
        Begin 
            if(@cSex = 'M')
            begin
                Insert into StaffLeaveSettings Values (@iSMID,@iLeaveID,0,'E',1,0,'I',Null,Null,Null,Null,Null,Null,Null,Null)
                Update StaffLeaveSettings Set iRefreshYear = 5 where iLeaveID = 4 and iSMID = @iSMID
                Select cSex from StaffMaster where iSMID = @iSMID
                Delete StaffLeaveSettings Where iLeaveID IN (2,5,7,10,11) and iSMID = @iSMID
            end
            else if(@cSex = 'F') 
            begin	
                Insert into StaffLeaveSettings Values (@iSMID,@iLeaveID,0,'E',1,0,'I',Null,Null,Null,Null,Null,Null,Null,Null)
                Update StaffLeaveSettings Set iRefreshYear = 5 where iLeaveID = 4 and iSMID = @iSMID
                Select cSex from StaffMaster where iSMID = @iSMID
                Delete StaffLeaveSettings Where iLeaveID IN (2,7,8,10,11) and iSMID = @iSMID
            end
            Set @iLeaveID = @iLeaveID + 1
        End
        Set @iSMID = @iSMID + 1
    End
End

Suvendu Shekhar Giri

Как вы узнали, что внешняя петля не работает?

Mohammed Asarudeen R

Да!

abinash panda

Похоже, что ваши обе петли работают. но после первого прохода внешнего цикла, когда дело доходит до второй итерации, @iLeaveID уже достиг максимального предела, поэтому он больше не входит во внутренний цикл, поэтому похоже, что ваш внешний цикл работает не более одного раза, но он зацикливается каждый раз, когда не удается войти во внутренний цикл. Надеюсь, это поможет. Мое предложение вам следует повторно инициализировать значение @iLeaveID где-то перед внутренним циклом и во внешнем цикле, т. е. установить @iLeaveID = 1;
после начала.

While (@iSMID <= 1662)
Начать
While (@iLeaveID <= 15)

1 Ответов

Рейтинг:
11

abinash panda

  Declare @cSex varchar
    Set @cSex = (Select cSex from StaffMaster where iSMID = @iSMID) 
    While(@iSMID <= 1662)
    Begin  
set @iLeaveID = 1;
        While(@iLeaveID <= 15)




Попробуйте использовать приведенный выше код.


Mohammed Asarudeen R

Спасибо Чувак

abinash panda

:)