2013-05-30 5 views
3

이 코드를 실행하면 표에 더 많은 값을 추가 할 때 더 이상 작동하지 않습니다. 어떤 도움을 주셔서 감사합니다, 감사합니다.커서를 사용하여 기존 표에 값 추가

declare @id int 
declare @empid int 
set @id = 0 
declare @schedindate datetime 
declare @ss nvarchar(100) 
declare @indice nvarchar(2) 
declare @FromDate datetime 
declare @ToDate datetime 
declare @TimeInR datetime 
declare @TimeOutR datetime 
declare @departmentID int 
declare @PositionID int 
declare @BranchID int 
declare @SupervisorID int 
declare @GradeID int 
declare @Custom1ID int 
declare @Custom2ID int 
declare @PayClassID int 
declare @EmploymentType int 
set @FromDate = '2009-01-14' 
set @ToDate = '2010-01-30' 
delete from table1 
declare cc cursor for select distinct empid from ta_timecard where schedindate between @FromDate and @ToDate 
open cc 
fetch next from cc into @empid 
while (@@fetch_status = 0) 
begin 
    set @id = @id + 1 
    insert into table1 (ID, EmpID) values (@id, @empid) 

    declare cc2 cursor for select distinct departmentid from ta_timecard where empid = @empid and schedindate between @FromDate and @ToDate 
    open cc2 
    fetch next from cc2 into @departmentID 

    while (@@fetch_status = 0) 
    begin 
     set @indice = cast(datediff(day, @fromdate, @schedindate) as nvarchar(4)) 
     set @ss = 'update table1 set departmetid = ' + convert(nvarchar(4), @departmentID) 
      + ' where empid = ' + convert(nvarchar(4), @empid) 

     execute sp_executesql @ss 
     fetch next from cc2 into @departmentID 
    end 
    close cc2 
    deallocate cc2 
fetch next from cc into @empid 
end 
close cc 
Deallocate cc 
GO 

enter image description here

을하지만 테이블에 더 많은 값을 추가 할 때 나는 첫 번째 행은

enter image description here

declare @id int 
declare @empid int 
set @id = 0 
declare @schedindate datetime 
declare @ss nvarchar(100) 
declare @indice nvarchar(2) 
declare @FromDate datetime 
declare @ToDate datetime 
declare @TimeInR datetime 
declare @TimeOutR datetime 
declare @departmentID int 
declare @PositionID int 
declare @BranchID int 
declare @SupervisorID int 
declare @GradeID int 
declare @Custom1ID int 
declare @Custom2ID int 
declare @PayClassID int 
declare @EmploymentType int 
set @FromDate = '2009-01-14' 
set @ToDate = '2010-01-30' 
delete from table1 
declare cc cursor for select distinct empid from ta_timecard where schedindate between @FromDate and @ToDate 
open cc 
fetch next from cc into @empid 
while (@@fetch_status = 0) 
begin 
    set @id = @id + 1 
    insert into table1 (ID, EmpID) values (@id, @empid) 

    declare cc2 cursor for select distinct departmentid, branchid from ta_timecard where empid = @empid --and schedindate between @FromDate and @ToDate 
    open cc2 
    fetch next from cc2 into @departmentID, @BranchID--,@PositionID 

    while (@@fetch_status = 0) 
    begin 
     set @indice = cast(datediff(day, @fromdate, @schedindate) as nvarchar(4)) 
     set @ss = 'update table1 set departmetid = ' + convert(nvarchar(4), @departmentID) 
      +', branchid = ' + convert(nvarchar(4), @BranchID) 
      --+ ', positionid = ' + convert(nvarchar(4), @PositionID) 
      + ' where empid = ' + convert(nvarchar(4), @empid) 
print(@ss) 
     execute sp_executesql @ss 
     fetch next from cc2 into @departmentID, @BranchID--, @PositionID 
    end 
    close cc2 
    deallocate cc2 
fetch next from cc into @empid 
end 
close cc 
Deallocate cc 
GO 

영향을 가지고 :

이 코드는 완벽하게 작동 편집 : 이 테이블입니다 ta_TimeCard은 n이 확인할 필요

+0

1) 동적 SQL을 사용하지 않을 경우 동적 SQL을 사용하지 마십시오. 이 경우에 당신은 그것없이 할 수 있습니다. 2) 커서가 잘못되었습니다. 커서의 커서는 악의 제곱입니다. 3) CTE에 대해 알아보십시오. 그들은 당신의 친구입니다. 3.1) http://stackoverflow.com/questions/6824669/why-is-cte-better-than-cursor-derived-table-subqueries-temp-table-etc 3.2) http://pratchev.blogspot.com /2008/03/updates-with-cte.html – Gibron

+0

'ta_timecard에서 다른 departmentid, branchid를 어디에 선택합니까? empid = @ empid'는 두 번째 커서에 대한 두 번째 쿼리를 반환합니까? – Gibron

+0

int의 목록을 반환해야합니다. 죄송합니다. 내가 무슨 뜻인지 이해하지 못했는지 모르겠다. – Nejthe

답변

1

당신의 결과에 영향을 줄 수있는

enter image description here

0

쿼리를 변경하십시오에서

set @ss = 'update table1 set departmetid = ' 

set @ss = 'update table1 set departmentid = ' 

에 @ BranchID on NULL 값

+ ISNULL(', branchid = ' + convert(nvarchar(4), @BranchID), '') 
+0

내가 테이블을 만들었을 때 'n'이 없으면 썼습니다. 왜 이런 식으로 보관 했나요? – Nejthe

+0

테이블 1에 삽입 할 수있는 부서 ID와 지점 ID를 테스트하십시오. 아마도 귀하의 데이터 유형이 요구 사항을 충족시키지 못합니다. –

+0

나는 그것을 모두 확인하고있다. – Nejthe