이 코드를 실행하면 표에 더 많은 값을 추가 할 때 더 이상 작동하지 않습니다. 어떤 도움을 주셔서 감사합니다, 감사합니다.커서를 사용하여 기존 표에 값 추가
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
을하지만 테이블에 더 많은 값을 추가 할 때 나는 첫 번째 행은
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이 확인할 필요
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
'ta_timecard에서 다른 departmentid, branchid를 어디에 선택합니까? empid = @ empid'는 두 번째 커서에 대한 두 번째 쿼리를 반환합니까? – Gibron
int의 목록을 반환해야합니다. 죄송합니다. 내가 무슨 뜻인지 이해하지 못했는지 모르겠다. – Nejthe