Вложенный цикл 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)