业务描述:从HR系统中同步人员信息(新入职,离职)
/* 同步HR系统新入职及离职员工数据 新入职:插入到对应部门的未分配部门里,事业部需区分文职,非文职 并插入信息到OA的员工表 处理过的用户标记为2 数据量不要超过1000条,否则有可能报错^_^. 数据源:tb_oa_employee(HR) 目标:OA_TAB_STAFF,OA_TAB_GWSTAFFS */ ALTER PROCEDURE dbo.HrUserDataToOa AS declare @isadd int declare @hrid int declare @staffno varchar(90) declare @staffname varchar(90) declare @wz int declare @deptcode varchar(90) declare @deptname varchar(90) declare @deptchildname varchar(90) declare @jobname varchar(90) declare @idcard varchar(90) declare @birth varchar(90) declare @sex varchar(1) declare @datejoin datetime declare @postid int declare yb cursor for select C_DATASTATUS,C_OID,C_CODE,C_NAME,C_ZWSX=(case C_ZWSX when '文职' then 1 when '非文职' then 0 end), C_BUMENCODE,C_BUMEN,C_ORGNAME,C_JOBNAME,C_IDCARD,C_BIRTH, C_SEX=(case C_SEX when '男' then 'M' when '女' then 'F' end),C_HIREDATE from [192.168.0.170].ehr.dbo.tb_oa_employee where c_linestatus=1 and c_zwsx is not null open yb fetch next from yb into @isadd,@hrid,@staffno,@staffname,@wz,@deptcode,@deptname,@deptchildname,@jobname,@idcard,@birth,@sex,@datejoin while @@fetch_status=0 begin if @isadd = 1 /*新入职*/ begin /*获取对应的OA职位编码 通过文职*/ /*select @postid=c_oajob from [192.168.0.170].ehr.dbo.tb_oa_job where c_code =@deptcode and c_wenzhi=@wz*/ set @postid = (select c_oajob from [192.168.0.170].ehr.dbo.tb_oa_job where c_code =@deptcode and c_wenzhi=@wz) if @postid is not null and @postid !='' and exists(select * from oa_tab_post where oa_post_id = @postid) begin /*print @staffno+'部门:'+@deptname+'deptcode'+@deptcode+'wz'+cast(@wz as varchar(10))+'postid:'+ cast(@postid as varchar(20))*/ /*如果在职位表中不存在,将该人员插入到未非配职位上*/ if not exists(select * from OA_TAB_STAFF where oa_staf_code=@staffno) begin insert into OA_TAB_STAFF(OA_STAF_CODE,OA_POST_ID,OA_IS_MAIN_POST) values(@staffno,@postid,1) end /*如果没有人员基础信息,则插入人员基本信息*/ if not exists(select * from OA_TAB_GWSTAFFS where oa_gws_staffno=@staffno) begin INSERT INTO OA_TAB_GWSTAFFS(OA_GWS_STAFFNO,OA_GWS_HRNAME,OA_GWS_HRSOCIETYID,OA_GWS_HRBIRTHDAY,OA_GWS_HRSEX,OA_GWS_HRDEPT1,OA_GWS_HRDEPT2,OA_GWS_HRDEPT3,OA_GWS_HRJOINDATE,OA_GWS_HRPOSITION,OA_GWS_HRLIVE) values(@staffno,@staffname,@idcard,@birth,@sex,@deptname,@deptchildname,'',@datejoin,@jobname,1) end update [192.168.0.170].ehr.dbo.tb_oa_employee set c_linestatus=3 where C_OID = @hrid end end else begin /*修改为离职状态*/ UPDATE OA_TAB_GWSTAFFS SET OA_GWS_HRLIVE=0 where OA_GWS_STAFFNO = @staffno /*删除职责信息*/ delete from OA_TAB_STAFF_DUTY where oa_stafpost_id in (select oa_stafpost_id from oa_tab_staff where oa_staf_code=@staffno) /*删除岗位信息*/ delete from OA_TAB_STAFF where OA_STAF_CODE = @staffno /*修改HR数据为已处理状态*/ update [192.168.0.170].ehr.dbo.tb_oa_employee set c_linestatus=2 where C_OID = @hrid end fetch next from yb into @isadd,@hrid,@staffno,@staffname,@wz,@deptcode,@deptname,@deptchildname,@jobname,@idcard,@birth,@sex,@datejoin end close yb deallocate yb
碰到的问题:循环时发现,所有的记录状态都变为2了,也就是都被处理过了。可实际上有些记录的@postid is null,应该不会执行才对。找了一下原来是select赋值的问题,当为空时,select 赋值会保留上一次的数据。
参考:http://www.cnblogs.com/McJeremy/archive/2011/03/30/1999508.html(set和select的区别)第三条