2012-12-26 2 views
0
declare @temp int, 
@temp1 int, 
@temp2 int, 
@temp3 int, 
@temp4 int, 
@temp5 int, 
@modid int, 
@supid int, 
@sid varchar(50) 
begin tran 
select * from StudentSupervisor; 

select @temp = count(*) from Students s where s.IsLockedOut = '0' and s.IsGraduated = '0'; 
select @temp1 = count(*) from staffs st where st.IsLockedOut ='0'; 



set @temp5 = round(@temp/@temp1,0); 

WHILE (select count(*) from students s where s.IsLockedOut ='0' and s.StudentId not in (select ss.StudentId from StudentSupervisor ss where s.StudentId = ss.StudentId and ss.IsApproved = 1)) != 0 

BEGIN 


select top 1 @sid = s.studentid from students s, StudentSupervisor ss where s.IsLockedOut ='0' and s.StudentId not in (select s.StudentId where s.StudentId = ss.StudentId and ss.IsApproved = 1); 


select top 1 @supid = st.Staffid, @modid = st.moderatorid from Staffs st where st.IsLockedOut =0 and Quota <[email protected]; 

     insert into StudentSupervisor 
     (StudentId,SupervisorId,ModeratorId,IsApproved) 
    values 
     (@sid,@supid,@modid,1) 
     update Staffs set quota +=1 where staffs.StaffID = @supid; 

END 


select * from StudentSupervisor; 

ROLLBACK tran 

안녕하세요.이 논리에 상당히 집착하고 있지만 해결책을 찾지 못했지만 밤늦게 일하다가 아무것도 얻지 못했습니다. 지금 상황을 먼저 알려 드리겠습니다. 학생 상담원 표나 학생 수첩 표에는없는 학생 수를 취하고 있습니다 만, 인정되고 있습니다! = 1, 그 다음에, 정원이 총 학생/총계 직원 이하의 직원 수를 취해, 그 후에 학생과 함께 펌프하고 싶습니다 직원들이 학생지도 테이블에 아직 사용할 수있는 동안 .. 내 동적 쿼리에 어떤 문제가 있는지 알려주세요. 감사합니다.while 루프에서 SQL에 테이블에 데이터를 삽입하는 방법

+1

비즈니스 논리에서 루프를 사용하지 말고 저장 프로 시저에서 가능한 한 많이 사용하지 마십시오. –

답변

0

질문 이해에 어려움이 있습니다. 루프 상태는 다음과 같아야합니다.

WHILE (SELECT COUNT(*) from students WHERE StudentID NOT IN (SELECT StudentID FROM StudentSupervisor WHERE IsAppoved = 1)) <> 0 

루프에서 수행하려는 작업에 따라 루프를 제거 할 수 있습니다. 루프에서 어떤 일이 일어나고 있는지 더 자세히 질문하여 질문을 업데이트 할 수 있다면 좀 더 완전한 대답을 제공하려고 노력할 것입니다.

업데이트 :

select top 1 @sid = studentid from students WHERE IsLockedOut = 0 and StudentId NOT IN (SELECT StudentID FROM StudentSupervisor WHERE IsAppoved = 1); 

갱신 2 표 변수 옵션 :

declare @temp int, 
    @temp1 int, 
    @temp2 int, 
    @temp5 int, 
    @PairCount int,       --The number of students paired with a staff member. 
    @modid int, 
    @supid int, 
    @StaffQuotaNeed int,     --The number of students the staff needs to be paired with to meet quota. 
    @sid varchar(50) 
DECLARE @StaffToPair table 
    (
     StaffID int NOT NULL, 
     ModeratorID int NOT NULL, 
     QuotaNeed int NOT NULL   --The number of students the staff needs to be paired with to meet quota. 
    ); 
DECLARE @StudentsToPair table (StudentID int NOT NULL); 
DECLARE @StudentsPaired table (StudentID int NOT NULL); 

begin tran 
select * from StudentSupervisor; 

select @temp = count(*) from Students where IsLockedOut = '0' and IsGraduated = '0'; 
select @temp1 = count(*) from staffs where IsLockedOut ='0'; 
set @temp5 = round(@temp/@temp1 + .5, 0);     --Round Up 

INSERT INTO @StaffToPair (StaffID, ModeratorID, QuotaNeed) 
        SELECT StaffID, ModeratorID, @temp5 - Quota FROM Staffs WHERE IsLockedOut =0 AND Quota <@temp5; 
INSERT INTO @StudentsToPair (StudentID) 
        SELECT StudentID from students WHERE IsLockedOut = 0 AND StudentId NOT IN (SELECT StudentID FROM StudentSupervisor WHERE IsAppoved = 1); 

WHILE (SELECT COUNT(*) from @StudentsToPair) > 0 AND (SELECT COUNT(*) from @StaffToPair) > 0 
BEGIN 
    SELECT TOP 1 @supid = Staffid, @modid = ModeratorID, @StaffQuotaNeed = QuotaNeed FROM @StaffToPair; 

    INSERT INTO StudentSupervisor (StudentID, SupervisorId, ModeratorId, IsApproved) 
     OUTPUT INSERTED.StudentID INTO @StudentsPaired(StudentID) 
     SELECT TOP (@StaffQuotaNeed) StudentID,  @supid,  @modid,   1 FROM @StudentsToPair; 

    DELETE FROM @StudentsToPair WHERE StudentID IN (SELECT StudentID FROM @StudentsPaired); --Delete paired students from table variable. 
    DELETE FROM @StaffToPair WHERE StaffID = @supid;          --Delete paired staff from table variable. 

    SELECT @PairCount = COUNT(*) FROM @StudentsPaired; 
    UPDATE Staffs set Quota += @PairCount where staffs.StaffID = @supid; 
END 


select * from StudentSupervisor; 

ROLLBACK tran 

경우]이 경우

나는 또한에 루프의 첫 번째 행을 업데이트 위의 작동하지 않는 다음 테이블 스키마를 포함하도록 질문을 업데이트하십시오. 그것을 내 시스템에서 테스트해라.

+0

연산! 나는 테이블 스태프, 학생, studentsupervisor를 가지고 있으며 직원이 할당량에 도달하지 않은 동안 studentupervisor 테이블에 내 학생과 직원을 배치하기 위해 자동 할당을하려고합니다. – willie

+0

@ user1824745 내 대답. 내가 제안하고있는 옵션의 예를 원한다면 의견을 추가하십시오. – Trisped

+0

예 가능한 경우 예제가 필요합니다. 대단히 감사합니다. – willie

관련 문제