一个考勤处理的SQL过程,编完运行 速度太慢了,用了游标,请大家帮忙给修改一下啊.现在350人,一个月的考勤,处理居然要30分钟.代码请贴子查看. ( 积分:

  • 主题发起人 主题发起人 tl_lyq
  • 开始时间 开始时间
T

tl_lyq

Unregistered / Unconfirmed
GUEST, unregistred user!
一个考勤处理的SQL过程,编完运行 速度太慢了,用了游标,请大家帮忙给修改一下啊.现在350人,一个月的考勤,处理居然要30分钟.代码请贴子查看. ( 积分: 40 )<br />CREATE&nbsp;PROCEDURE&nbsp;[dbo].[KqCalc]&nbsp;&nbsp;&nbsp;&nbsp;@sdate&nbsp;datetime,@edate&nbsp;datetime&nbsp;&nbsp;&nbsp;&nbsp;AS<br><br>set&nbsp;nocount&nbsp;on&nbsp;<br>declare&nbsp;&nbsp;&nbsp;@tmpdate0&nbsp;&nbsp;datetime,@nmonths&nbsp;int<br><br>IF&nbsp;@edate&lt;@sdate&nbsp;&nbsp;&nbsp;<br>begin<br>&nbsp;&nbsp;set&nbsp;&nbsp;&nbsp;@tmpdate0=@sdate&nbsp;&nbsp;set&nbsp;&nbsp;&nbsp;@sdate=@edate&nbsp;&nbsp;set&nbsp;&nbsp;&nbsp;@edate=@tmpdate0&nbsp;&nbsp;<br>end<br>&nbsp;<br>set&nbsp;&nbsp;@nmonths=year(@edate+1)*12+MONTH(@edate+1)-YEAR(@sdate-1)*12-MONTH(@sdate-1)+1<br><br>declare&nbsp;<br>&nbsp;&nbsp;@tmpdate&nbsp;varchar(20),&nbsp;&nbsp;@tmpdate1&nbsp;datetime,@currqpre&nbsp;varchar(10),@currq&nbsp;varchar(10)&nbsp;,@currqnext&nbsp;varchar(20),@csjfwa1&nbsp;varchar(20),@csjfwa2&nbsp;varchar(20),@csjfwb1&nbsp;varchar(20),@csjfwb2&nbsp;varchar(20),@sjtmp&nbsp;varchar(20),<br>&nbsp;&nbsp;@ndays&nbsp;int,@i&nbsp;int,@j&nbsp;int,@y&nbsp;int,@m&nbsp;int,@tmpval&nbsp;int,<br>&nbsp;&nbsp;@lqj&nbsp;int,@csjfwa1_i&nbsp;bigint,@csjfwa2_i&nbsp;bigint,@csjfwb1_i&nbsp;bigint,@csjfwb2_i&nbsp;bigint&nbsp;,<br>&nbsp;&nbsp;@cjcsj&nbsp;varchar(20),@mc&nbsp;varchar(20),@sj1&nbsp;varchar(10),@sj2&nbsp;varchar(10),@sj3&nbsp;varchar(10),@sbfw&nbsp;varchar(10),@xbfw&nbsp;varchar(10),@jbsj&nbsp;varchar(10),&nbsp;@cjbsj&nbsp;varchar(10),<br>&nbsp;&nbsp;@bh&nbsp;varchar(20)&nbsp;,@kh&nbsp;varchar(20)&nbsp;,@bm&nbsp;varchar(20)&nbsp;,@xm&nbsp;varchar(20)&nbsp;,@bc&nbsp;varchar(20)&nbsp;,@cfield&nbsp;varchar(20),&nbsp;@sqlstr&nbsp;nvarchar(4000),@bcsm&nbsp;varchar(20),<br>&nbsp;&nbsp;@okcs&nbsp;numeric(5,2),@qqcs&nbsp;numeric(5,2)&nbsp;,@ztfk&nbsp;numeric(5,2),@cdfk&nbsp;numeric(5,2),@cqts&nbsp;numeric(5,2),@qqfk&nbsp;numeric(5,2),@cclx&nbsp;numeric(5,1),@sj&nbsp;numeric(5,1),@sj1a&nbsp;varchar(20),@sj1b&nbsp;varchar(20),@sj2a&nbsp;varchar(20),@sj2b&nbsp;varchar(20),@cdsj&nbsp;int,@ztsj&nbsp;int,@kjyear&nbsp;int,@kjmonth&nbsp;int<br><br>&nbsp;&nbsp;set&nbsp;@i=0&nbsp;set&nbsp;@j=0&nbsp;set&nbsp;@csjfwa1_i=0&nbsp;set&nbsp;@csjfwb1_i=0&nbsp;set&nbsp;@csjfwa2_i=0&nbsp;set&nbsp;@csjfwb2_i=0<br>&nbsp;&nbsp;set&nbsp;@kjyear=year(@sdate)&nbsp;set&nbsp;@kjmonth=month(@sdate)<br><br>--初始化<br>CREATE&nbsp;TABLE&nbsp;#kqtjtmp(bh&nbsp;varchar(10),&nbsp;kh&nbsp;varchar(20),&nbsp;xm&nbsp;varchar(10),&nbsp;rq&nbsp;varchar(12),sj1a&nbsp;varchar(10)&nbsp;not&nbsp;null&nbsp;default&nbsp;'',&nbsp;sj1b&nbsp;varchar(10)&nbsp;not&nbsp;null&nbsp;default&nbsp;'',&nbsp;sj2a&nbsp;varchar(10)&nbsp;not&nbsp;null&nbsp;default&nbsp;'',&nbsp;sj2b&nbsp;varchar(10)&nbsp;not&nbsp;null&nbsp;default&nbsp;'',&nbsp;sj3a&nbsp;varchar(10)&nbsp;not&nbsp;null&nbsp;default&nbsp;''&nbsp;,sj3b&nbsp;varchar(10)&nbsp;not&nbsp;null&nbsp;default&nbsp;'',&nbsp;cdsj&nbsp;int&nbsp;not&nbsp;null&nbsp;default&nbsp;0,&nbsp;ztsj&nbsp;int&nbsp;not&nbsp;null&nbsp;default&nbsp;0,&nbsp;jbsj&nbsp;int&nbsp;not&nbsp;null&nbsp;default&nbsp;0,&nbsp;sbsj&nbsp;int&nbsp;not&nbsp;null&nbsp;default&nbsp;0,&nbsp;bcsm&nbsp;varchar(50)&nbsp;not&nbsp;null&nbsp;default&nbsp;'',&nbsp;bm&nbsp;varchar(50)&nbsp;not&nbsp;null&nbsp;default&nbsp;''&nbsp;&nbsp;)<br>create&nbsp;table&nbsp;#kqhz(cclxdays&nbsp;numeric(10,1),&nbsp;qjdays&nbsp;numeric(10,1),&nbsp;cqdays&nbsp;numeric(10,1),&nbsp;jsdays&nbsp;numeric(10,1),&nbsp;cdfk&nbsp;numeric(10,1),&nbsp;ztfk&nbsp;numeric(10,1),&nbsp;qqfk&nbsp;numeric(10,1)&nbsp;&nbsp;)<br>IF&nbsp;EXISTS&nbsp;(SELECT&nbsp;id&nbsp;&nbsp;FROM&nbsp;tempdb..sysobjects&nbsp;&nbsp;&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;'##count')&nbsp;DROP&nbsp;TABLE&nbsp;##count&nbsp;create&nbsp;table&nbsp;##count(id&nbsp;int)<br>select&nbsp;distinct&nbsp;&nbsp;bh,kh,convert(varchar(8),rq,112)&nbsp;rq,&nbsp;REPLACE(CONVERT(char(5),&nbsp;sj,&nbsp;8),&nbsp;':',&nbsp;'')&nbsp;sj&nbsp;into&nbsp;#datatmp&nbsp;from&nbsp;rlkh.dbo.yskq&nbsp;where&nbsp;rq&nbsp;between&nbsp;@sdate&nbsp;and&nbsp;@edate&nbsp;order&nbsp;by&nbsp;bh,kh,rq<br>create&nbsp;index&nbsp;&nbsp;rqsj&nbsp;&nbsp;ON&nbsp;#datatmp(rq)<br>create&nbsp;table&nbsp;#sjtmp&nbsp;(sj&nbsp;varchar(20))&nbsp;<br>SELECT&nbsp;bc,&nbsp;Rq,&nbsp;sj1,&nbsp;sj2,&nbsp;sbfw,&nbsp;xbfw&nbsp;into&nbsp;#kqsj_bb&nbsp;FROM&nbsp;rlkh.dbo.kqsj_bb&nbsp;where&nbsp;rq&nbsp;between&nbsp;@sdate&nbsp;and&nbsp;@edate<br>SELECT&nbsp;xmbh,&nbsp;rq,&nbsp;zl,&nbsp;lx&nbsp;into&nbsp;#qj&nbsp;FROM&nbsp;tl.dbo.qj&nbsp;where&nbsp;rq&nbsp;between&nbsp;@sdate&nbsp;and&nbsp;@edate<br><br>delete&nbsp;from&nbsp;kqhz&nbsp;where&nbsp;&nbsp;kjyear=@kjyear&nbsp;and&nbsp;kjmonth=@kjmonth<br>delete&nbsp;from&nbsp;kqmx&nbsp;where&nbsp;year(rq)=@kjyear&nbsp;&nbsp;and&nbsp;month(rq)=@kjmonth<br>set&nbsp;@ndays=&nbsp;datediff(day,@sdate,@edate)&nbsp;<br><br><br>--根据人事库处理考勤<br>declare&nbsp;&nbsp;Emp_cur&nbsp;&nbsp;cursor&nbsp;for&nbsp;&nbsp;Select&nbsp;bh,kh,bm,xm,bc&nbsp;&nbsp;From&nbsp;&nbsp;rlkh.dbo.employee&nbsp;&nbsp;where&nbsp;kh&lt;&gt;''&nbsp;&nbsp;order&nbsp;by&nbsp;bh<br>open&nbsp;&nbsp;Emp_cur<br><br>fetch&nbsp;next&nbsp;from&nbsp;Emp_Cur&nbsp;into&nbsp;@bh,@kh,@bm,@xm,@bc<br>while&nbsp;&nbsp;(@@FETCH_STATUS&nbsp;=&nbsp;0)<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@j=0<br> while&nbsp;@j&lt;=@ndays&nbsp;<br> begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--开始j<br> set&nbsp;@currqpre=convert(varchar(8),@sdate+@j-1,112)<br> set&nbsp;@currq=&nbsp;convert(varchar(8),&nbsp;@sdate+@j,112)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> set&nbsp;@currqnext=convert(varchar(8),&nbsp;@sdate+@j+1,112)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;from&nbsp;#sjtmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> insert&nbsp;into&nbsp;#sjtmp&nbsp;&nbsp;select&nbsp;rq+sj&nbsp;&nbsp;FROM&nbsp;#datatmp&nbsp;WHERE&nbsp;bh=@bh&nbsp;AND&nbsp;rq&nbsp;between&nbsp;&nbsp;&nbsp;@currqpre&nbsp;and&nbsp;&nbsp;@currqnext&nbsp;&nbsp;&nbsp;<br> INSERT&nbsp;INTO&nbsp;#kqtjtmp&nbsp;(kh,xm,rq,bm,bh)&nbsp;VALUES(@kh,@xm,@currq,@bm,@bh)<br> set&nbsp;@mc=''<br> select&nbsp;@mc=mc&nbsp;&nbsp;from&nbsp;&nbsp;rlkh.dbo.jjr&nbsp;&nbsp;&nbsp;where&nbsp;rq=@currq<br> if&nbsp;@mc&lt;&gt;''<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update&nbsp;#kqtjtmp&nbsp;&nbsp;set&nbsp;&nbsp;bcsm='(节:'+@mc+')'&nbsp;&nbsp;&nbsp;<br> else<br> begin<br> select&nbsp;@mc=zl+lx&nbsp;&nbsp;from&nbsp;&nbsp;#qj&nbsp;&nbsp;&nbsp;where&nbsp;rq=@currq&nbsp;and&nbsp;xmbh=@bh&nbsp;<br> set&nbsp;@lqj=0<br> if&nbsp;@mc&lt;&gt;''<br> begin<br>&nbsp;&nbsp; &nbsp;&nbsp;update&nbsp;#kqtjtmp&nbsp;&nbsp;set&nbsp;&nbsp;bcsm='(请:'+@mc+')'&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;set&nbsp;@lqj=1<br> end<br> select&nbsp;@sj1=sj1,&nbsp;@sj2=sj2,&nbsp;@sbfw=sbfw,&nbsp;@xbfw=xbfw&nbsp;&nbsp;from&nbsp;#kqsj_bb&nbsp;where&nbsp;bc=@bc&nbsp;and&nbsp;rq=@currq <br> IF&nbsp;EXISTS&nbsp;(SELECT&nbsp;id&nbsp;&nbsp;FROM&nbsp;tempdb..sysobjects&nbsp;&nbsp;&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;'##A')&nbsp;DROP&nbsp;TABLE&nbsp;##A<br> create&nbsp;table&nbsp;##A&nbsp;(id&nbsp;int&nbsp;,a&nbsp;varchar(4),b&nbsp;varchar(4)&nbsp;)<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(1,LEFT(@sj1,4),RIGHT(@sj1,4)&nbsp;)<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(2,LEFT(@sj2,4),RIGHT(@sj2,4)&nbsp;)<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(3,LEFT(@sj3,4),RIGHT(@sj3,4)&nbsp;)<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(4,cast(LEFT(@sbfw,3)&nbsp;as&nbsp;integer),cast(RIGHT(@sbfw,3)as&nbsp;integer))<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(5,cast(LEFT(@xbfw,3)&nbsp;as&nbsp;integer),cast(RIGHT(@xbfw,3)&nbsp;as&nbsp;integer))<br> IF&nbsp;LEN(@jbsj)&lt;&gt;4&nbsp;set&nbsp;@cjbsj=''&nbsp;ELSE&nbsp;set&nbsp;@cjbsj=@jbsj<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(select&nbsp;count(sj)&nbsp;from&nbsp;#sjtmp)&gt;0&nbsp;<br> begin<br> set&nbsp;@i=1<br> while&nbsp;@i&lt;=2<br> begin&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@csjfwa1_i=0&nbsp;set&nbsp;@csjfwb1_i=0&nbsp;set&nbsp;@csjfwa2_i=0&nbsp;set&nbsp;@csjfwb2_i=0&nbsp;set&nbsp;@sjtmp=''&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(select&nbsp;&nbsp;len(a)+len(b)&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i)&nbsp;&gt;=&nbsp;4&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;<br> select&nbsp;&nbsp;&nbsp;@csjfwa1_i=left(a,2)*60+right(a,2)-(select&nbsp;a&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=4)&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i<br> set&nbsp;@tmpdate=@currq<br> IF&nbsp;@csjfwa1_i&lt;0<br> begin<br> set&nbsp;@tmpdate=@currqpre<br> set&nbsp;@csjfwa1_i=1440+@csjfwa1_i<br> end<br> ELSE&nbsp;IF&nbsp;@csjfwa1_i&gt;1440<br> begin&nbsp;<br> set&nbsp;@tmpdate=@currqnext<br> set&nbsp;@csjfwa1_i=@csjfwa1_i-1440<br> end<br><br> set&nbsp;@csjfwa1=@tmpdate+replace(str(@csjfwa1_i/60,&nbsp;2),'&nbsp;','0')+replace(str(@csjfwa1_i&nbsp;%&nbsp;60&nbsp;,2),'&nbsp;','0')<br> select&nbsp;&nbsp;&nbsp;@csjfwb1_i=left(a,2)*60+right(a,2)+(select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=4)&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i<br> set&nbsp;@tmpdate=@currq<br> <br> IF&nbsp;@csjfwb1_i&gt;1440<br> begin<br> set&nbsp;@tmpdate=@currqnext<br> set&nbsp;@csjfwb1_i=@csjfwb1_i-1440<br> end<br> set&nbsp;&nbsp;@csjfwb1=@tmpdate+replace(str(@csjfwb1_i/60,2),'&nbsp;'&nbsp;,&nbsp;'0')+replace(str(@csjfwb1_i&nbsp;%&nbsp;60&nbsp;,2),'&nbsp;','0')<br><br> set&nbsp;@cfield='sj'+str(@i,1)+'a'<br> select&nbsp;@sjtmp=sj&nbsp;from&nbsp;&nbsp;#sjtmp&nbsp;where&nbsp;sj&nbsp;between&nbsp;&nbsp;@csjfwa1&nbsp;and&nbsp;&nbsp;@csjfwb1<br> if&nbsp;@sjtmp&lt;&gt;'' <br> begin<br> /*set&nbsp;@lsb=1<br> set&nbsp;@y&nbsp;=year(LEFT(@sjtmp,8))+4800-(14-&nbsp;month(LEFT(@sjtmp,8)))&nbsp;/&nbsp;12<br> set&nbsp;@m&nbsp;=month(LEFT(@sjtmp,8))+12*((14-&nbsp;month(LEFT(@sjtmp,8)))&nbsp;/&nbsp;12)-3<br> set&nbsp;@nsbsj1=&nbsp;1440*day(LEFT(@sjtmp,8))+(153*@m+2)/5+365*@y+@y/4-@y/100+@y/400-32045&nbsp;+cast&nbsp;(SUBSTRing(@sjtmp,9,2)&nbsp;as&nbsp;integer)*60+cast(RIGHT(@sjtmp,2)&nbsp;as&nbsp;integer) <br> */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@sjtmp&gt;@currq+(select&nbsp;a&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i)<br> begin --('+RIGHT(@sjtmp,4)+')<br> set&nbsp;@sqlstr='update&nbsp;#kqtjtmp&nbsp;set&nbsp;'+@cfield+'&nbsp;=&nbsp;''迟到''&nbsp;&nbsp;&nbsp;'&nbsp;<br> exec&nbsp;sp_executesql&nbsp;@sqlstr<br><br> set&nbsp;@tmpval=datediff(minute,@currq+'&nbsp;'+left((select&nbsp;a&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i),2)+':'+right((select&nbsp;a&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i),2)+':00',left(@sjtmp,8)+'&nbsp;'+left(right(@sjtmp,4),2)+':'+right(@sjtmp,2)+':00')<br> update&nbsp;#kqtjtmp&nbsp;set&nbsp;cdsj&nbsp;=&nbsp;cdsj+@tmpval&nbsp;<br> end<br> else<br> begin --(''+RIGHT('+@sjtmp+',4)+'')<br> set&nbsp;@sqlstr='update&nbsp;#kqtjtmp&nbsp;set&nbsp;'+@cfield+'&nbsp;=&nbsp;''OK''&nbsp;&nbsp;'&nbsp;<br> exec&nbsp;sp_executesql&nbsp;@sqlstr<br> end<br> end&nbsp;<br> else<br> begin<br> IF&nbsp;@lqj=0<br> begin<br> set&nbsp;@sqlstr='update&nbsp;#kqtjtmp&nbsp;set&nbsp;'+@cfield+'&nbsp;=''--''&nbsp;&nbsp;&nbsp;'&nbsp;<br> exec&nbsp;sp_executesql&nbsp;@sqlstr<br> end <br> end<br> --开始11<br> IF&nbsp;&nbsp;&nbsp;(select&nbsp;a&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i)&lt;&gt;(select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br> set&nbsp;@csjfwa2_i=cast(LEFT(&nbsp;(select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i)&nbsp;,2)&nbsp;as&nbsp;integer)*60+cast(RIGHT((select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i)&nbsp;,2)&nbsp;as&nbsp;integer)-(select&nbsp;a&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=5&nbsp;)<br> set&nbsp;@tmpdate1=@sdate+@j<br> IF&nbsp;(select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i)&nbsp;&lt;&nbsp;(select&nbsp;a&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i)&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@tmpdate1=@tmpdate1+1 <br> set&nbsp;@tmpdate=convert(varchar(8),@tmpdate1,112)<br> IF&nbsp;@csjfwa2_i&lt;0&nbsp;&nbsp;<br> begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> set&nbsp;@tmpdate=convert(varchar(8),@tmpdate1-1,112)<br> set&nbsp;@csjfwa2_i=1440+@csjfwa2_i<br> end <br> set&nbsp;@csjfwa2=@tmpdate+replace(str&nbsp;(@csjfwa2_i/60&nbsp;,2),'&nbsp;','0')+replace(str(@csjfwa2_i&nbsp;%&nbsp;60&nbsp;,2),'&nbsp;','0')<br> set&nbsp;@csjfwb2_i=cast(LEFT((select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i),2)&nbsp;as&nbsp;integer)*60+cast(RIGHT((select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i),2)&nbsp;as&nbsp;integer)+(select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=5)<br> set&nbsp;@tmpdate=convert(varchar(8),@tmpdate1,112)&nbsp;&nbsp;<br> IF&nbsp;@csjfwb2_i&gt;1440<br> begin<br> set&nbsp;@tmpdate=convert(varchar(8),@tmpdate1+1,112)&nbsp;&nbsp;<br> set&nbsp;@csjfwb2_i=@csjfwb2_i-1440<br> end&nbsp;&nbsp;&nbsp;<br> set&nbsp;@csjfwb2=@tmpdate+replace(str(@csjfwb2_i/60,2),'&nbsp;','0')+replace(str&nbsp;(@csjfwb2_i&nbsp;%&nbsp;60,2),'&nbsp;','0')<br> set&nbsp;@cfield='sj'+str(@i&nbsp;,1)+'b'<br> select&nbsp;@sjtmp=sj&nbsp;from&nbsp;#sjtmp&nbsp;where&nbsp;sj&nbsp;between&nbsp;@csjfwa2&nbsp;and&nbsp;@csjfwb2<br> --开始12<br> if&nbsp;(select&nbsp;count(sj)&nbsp;from&nbsp;#sjtmp&nbsp;where&nbsp;sj&nbsp;between&nbsp;@csjfwa2&nbsp;and&nbsp;@csjfwb2)&gt;0<br> begin<br> /* IF&nbsp;@lsb=1<br> begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> set&nbsp;@nsbsj1=&nbsp;1440*day(LEFT(@sjtmp,8))+(153*@m+2)/5+365*@y+@y/4-@y/100+@y/400-32045&nbsp;+<br> cast&nbsp;(SUBSTRing(@sjtmp,9,2)&nbsp;as&nbsp;integer)*60+cast(RIGHT(@sjtmp,2)&nbsp;as&nbsp;integer)-@nsbsj1<br> set&nbsp;@nsbsj1=@nsbsj1&nbsp;&nbsp;<br> IF&nbsp;@nsbsj1&gt;0<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@nsbsj=@nsbsj+@nsbsj1 <br> end&nbsp;*/<br> IF&nbsp;@sjtmp&lt;@tmpdate+&nbsp;(select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i)<br> begin<br> set&nbsp;@tmpval=datediff(minute,@tmpdate+'&nbsp;'+left((select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i),2)+':'+right((select&nbsp;b&nbsp;from&nbsp;##A&nbsp;where&nbsp;id=@i),2)+':00',left(@sjtmp,8)+'&nbsp;'+left(right(@sjtmp,4),2)+':'+right(@sjtmp,2)+':00') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> set&nbsp;@sqlstr='update&nbsp;#kqtjtmp&nbsp;set&nbsp;'+@cfield+'&nbsp;=''早退''&nbsp;&nbsp;&nbsp;'&nbsp;--('+RIGHT(@sjtmp,4)+')<br> exec&nbsp;sp_executesql&nbsp;@sqlstr <br> update&nbsp;#kqtjtmp&nbsp;set&nbsp;&nbsp;ztsj&nbsp;=ztsj+@tmpval&nbsp;&nbsp;<br> --set&nbsp;@nztsjh=@nztsjh+@tmpval<br> end<br> else&nbsp;<br> begin&nbsp; --('+RIGHT(@sjtmp,4)+')<br> set&nbsp;@sqlstr='update&nbsp;#kqtjtmp&nbsp;set&nbsp;'+@cfield+'&nbsp;=''OK'''&nbsp;<br> exec&nbsp;sp_executesql&nbsp;@sqlstr<br> end<br> end<br> ELSE<br> begin<br> IF&nbsp;@lqj=0<br> begin<br> set&nbsp;@sqlstr='update&nbsp;#kqtjtmp&nbsp;set&nbsp;'+@cfield+'&nbsp;=''--'''&nbsp;<br> exec&nbsp;sp_executesql&nbsp;@sqlstr<br> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; end<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@i=@i+1<br> end&nbsp;<br> end&nbsp;<br> else<br> begin<br> IF&nbsp;@lqj=0<br> begin<br> set&nbsp;@i=1<br> while&nbsp;@i&lt;=2<br> begin <br> &nbsp;&nbsp;&nbsp;set&nbsp;@sqlstr='update&nbsp;#kqtjtmp&nbsp;set&nbsp;sj'+str(@i&nbsp;,1)+'a&nbsp;=''--'',sj'+str(@i&nbsp;,1)+'b&nbsp;=''--''&nbsp;'&nbsp;<br> &nbsp;&nbsp;&nbsp;exec&nbsp;sp_executesql&nbsp;@sqlstr <br>&nbsp; &nbsp;&nbsp;&nbsp;set&nbsp;@i=@i+1<br> end<br> end&nbsp;&nbsp;<br> end&nbsp;<br> end&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--统计<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;set&nbsp;@okcs=0&nbsp;set&nbsp;@qqcs=0&nbsp;set&nbsp;@qqfk=0&nbsp;set&nbsp;@ztfk=0&nbsp;set&nbsp;@cdfk=0&nbsp;set&nbsp;@sj=0&nbsp;set&nbsp;@cclx=0&nbsp;set&nbsp;@cqts=0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;@sj1a=sj1a,@sj1b=sj1b,@sj2a=sj2a,@sj2b=sj2b,@bcsm=bcsm&nbsp;from&nbsp;#kqtjtmp&nbsp;&nbsp;<br> &nbsp;&nbsp;if&nbsp;(@bcsm='(请:轮休整)'&nbsp;or&nbsp;@bcsm='(请:出差整)')&nbsp;&nbsp;begin&nbsp;set&nbsp;@cclx=1&nbsp;set&nbsp;@cqts=1&nbsp;end<br> &nbsp;&nbsp;else&nbsp;if&nbsp;(@bcsm='(请:轮休半)'&nbsp;or&nbsp;@bcsm='(请:出差半)')&nbsp;begin&nbsp;set&nbsp;@cclx=0.5&nbsp;set&nbsp;@cqts=1&nbsp;&nbsp;end<br> &nbsp;&nbsp;else&nbsp;if&nbsp;(@bcsm='(请:事假整)')&nbsp;begin&nbsp;set&nbsp;@sj=1&nbsp;set&nbsp;@cqts=0&nbsp;end<br> &nbsp;&nbsp;else&nbsp;if&nbsp;(@bcsm='(请:事假半)')&nbsp;begin&nbsp;set&nbsp;@sj=0.5&nbsp;set&nbsp;@cqts=0.5&nbsp;&nbsp;end<br> &nbsp;&nbsp;else&nbsp;<br> &nbsp;&nbsp;begin&nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@sj1a&nbsp;in&nbsp;('ok','迟到','早退')&nbsp;&nbsp;set&nbsp;@okcs=@okcs+1&nbsp;else&nbsp;if&nbsp;@sj1a='--'&nbsp;set&nbsp;@qqcs=@qqcs+1<br> &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@sj1b&nbsp;in&nbsp;('ok','迟到','早退')&nbsp;&nbsp;set&nbsp;@okcs=@okcs+1&nbsp;else&nbsp;if&nbsp;@sj1b='--'&nbsp;set&nbsp;@qqcs=@qqcs+1<br> &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@sj2a&nbsp;in&nbsp;('ok','迟到','早退')&nbsp;&nbsp;set&nbsp;@okcs=@okcs+1&nbsp;else&nbsp;if&nbsp;@sj2a='--'&nbsp;set&nbsp;@qqcs=@qqcs+1<br> &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@sj2b&nbsp;in&nbsp;('ok','迟到','早退')&nbsp;&nbsp;set&nbsp;@okcs=@okcs+1&nbsp;else&nbsp;if&nbsp;@sj2b='--'&nbsp;set&nbsp;@qqcs=@qqcs+1&nbsp; <br> &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@okcs&nbsp;in&nbsp;(1,2,3)&nbsp;&nbsp;set&nbsp;@cqts=0.5&nbsp;&nbsp;else&nbsp;if&nbsp;@okcs=4&nbsp;&nbsp;set&nbsp;@cqts=1&nbsp;&nbsp;else&nbsp;set&nbsp;@cqts=0<br> &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@qqcs&nbsp;in&nbsp;(1,2,3)&nbsp;begin&nbsp;set&nbsp;@qqfk=10*@qqcs&nbsp;&nbsp;set&nbsp;@cqts=1&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;@qqcs=4&nbsp;&nbsp;set&nbsp;@cqts=0&nbsp;&nbsp;<br> &nbsp;&nbsp;end <br> &nbsp;&nbsp;if&nbsp;@cdsj&gt;0&nbsp;and&nbsp;@cdsj&lt;=5&nbsp;set&nbsp;@cdfk=1&nbsp;else&nbsp;if&nbsp;(@cdsj&nbsp;&gt;5&nbsp;and&nbsp;@cdsj&lt;=15)&nbsp;set&nbsp;@cdfk=2&nbsp;else&nbsp;if&nbsp;(@cdsj&nbsp;&gt;15&nbsp;and&nbsp;@cdsj&lt;=30)&nbsp;set&nbsp;@cdfk=5&nbsp;else&nbsp;set&nbsp;@cdfk=0<br> &nbsp;&nbsp;if&nbsp;@ztsj&nbsp;&gt;&nbsp;0&nbsp;and&nbsp;@ztsj&lt;=30&nbsp;set&nbsp;@ztfk=5&nbsp;&nbsp;else&nbsp;set&nbsp;@ztfk=0 <br> &nbsp;&nbsp;if&nbsp;exists(select&nbsp;cclxdays&nbsp;from&nbsp;#kqhz&nbsp;)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update&nbsp;#kqhz&nbsp;set&nbsp;cclxdays=cclxdays+@cclx,qjdays=qjdays+@sj,cqdays=cqdays+@cqts,cdfk=cdfk+@cdfk,ztfk=ztfk+@ztfk,qqfk=qqfk+@qqfk<br> &nbsp;&nbsp;else<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert&nbsp;into&nbsp;&nbsp;#kqhz&nbsp;(cclxdays,&nbsp;qjdays,&nbsp;cqdays,&nbsp;jsdays,&nbsp;cdfk,&nbsp;ztfk,&nbsp;qqfk)&nbsp;&nbsp;values(@cclx,@sj,@cqts,0,@cdfk,@ztfk,@qqfk) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;insert&nbsp;into&nbsp;kqmx&nbsp;(bh,&nbsp;kh,&nbsp;xm,&nbsp;rq,&nbsp;sj1a,&nbsp;sj1b,&nbsp;sj2a,&nbsp;sj2b,sj3a,sj3b,cdsj,&nbsp;ztsj,jbsj,sbsj,&nbsp;bcsm,&nbsp;bm)&nbsp;select&nbsp;*&nbsp;from&nbsp;#kqtjtmp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;exists(select&nbsp;id&nbsp;from&nbsp;##count)&nbsp;&nbsp;update&nbsp;##count&nbsp;set&nbsp;id=id+1&nbsp;else&nbsp;insert&nbsp;into&nbsp;##count&nbsp;(id)values(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;from&nbsp;#kqtjtmp<br> &nbsp;&nbsp;&nbsp;set&nbsp;@j=@j+1<br> end&nbsp;--结束j&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert&nbsp;into&nbsp;kqhz&nbsp;select&nbsp;@kjyear,&nbsp;@kjmonth,&nbsp;@xm,&nbsp;@bh,&nbsp;@bm,&nbsp;@kh,&nbsp;cclxdays,&nbsp;qjdays,&nbsp;cqdays,&nbsp;jsdays,&nbsp;cdfk,&nbsp;ztfk,&nbsp;qqfk,&nbsp;cdfk+ztfk+qqfk&nbsp;&nbsp;from&nbsp;#kqhz<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;from&nbsp;#kqhz<br> fetch&nbsp;next&nbsp;from&nbsp;Emp_Cur&nbsp;into&nbsp;@bh,@kh,@bm,@xm,@bc<br>end<br>close&nbsp;Emp_cur<br>deallocate&nbsp;Emp_cur<br>update&nbsp;&nbsp;kqhz&nbsp;set&nbsp;jsdays=case&nbsp;when&nbsp;bm&nbsp;in&nbsp;('棉一','棉二','织一','新车间')&nbsp;then&nbsp;0&nbsp;else&nbsp;&nbsp;cast((cqdays&nbsp;/&nbsp;6)&nbsp;as&nbsp;integer)&nbsp;end&nbsp;where&nbsp;&nbsp;kjyear=@kjyear&nbsp;and&nbsp;kjmonth=@kjmonth<br>GO
 
代码折行了,可以拷到记事本看,&nbsp;劳驾哪位高手啊...
 
1.做大量数据处理&nbsp;游标尽量少用,影响性能<br>2.考虑用UPDATE&nbsp;(按条件分几次)<br>3.正式更新时加上事务处理&nbsp;&nbsp;&nbsp;&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;insert&nbsp;into&nbsp;kqhz&nbsp;select&nbsp;@kjyear,&nbsp;@kjmonth,&nbsp;@xm,&nbsp;@bh,&nbsp;@bm,&nbsp;@kh,&nbsp;cclxdays,&nbsp;qjdays,&nbsp;cqdays,&nbsp;jsdays,&nbsp;cdfk,&nbsp;ztfk,&nbsp;qqfk,&nbsp;cdfk+ztfk+qqfk&nbsp;&nbsp;from&nbsp;#kqhz<br>4.增加错误处理
 
因为计算比较麻烦,不用游标不太好处理啊。。。如果用事务处理,会快些吗?我试试看
 
不要用游标,最好用临时表,这样速度就快多了
 
事务处理和速度无关,&nbsp;如果处理时间长加上事务还容易发生死锁.<br>改善一下索引,速度可以加快
 
谢谢各位啊,问题解决了,是我循环里边处理的不太好.&nbsp;班次放外边去就可以了.原来要用30分钟,现在2分多就处理完了.<br><br>下边这段,放循环外边就OK了.这个考勤处理直接采集考勤机的原始考勤,然后生成汇总后的考勤&nbsp;总算完工了&nbsp;...............<br> select&nbsp;@sj1=sj1,&nbsp;@sj2=sj2,&nbsp;@sbfw=sbfw,&nbsp;@xbfw=xbfw&nbsp;&nbsp;from&nbsp;#kqsj_bb&nbsp;where&nbsp;bc=@bc&nbsp;and&nbsp;rq=@currq <br> IF&nbsp;EXISTS&nbsp;(SELECT&nbsp;id&nbsp;&nbsp;FROM&nbsp;tempdb..sysobjects&nbsp;&nbsp;&nbsp;WHERE&nbsp;name&nbsp;=&nbsp;'##A')&nbsp;DROP&nbsp;TABLE&nbsp;##A<br> create&nbsp;table&nbsp;##A&nbsp;(id&nbsp;int&nbsp;,a&nbsp;varchar(4),b&nbsp;varchar(4)&nbsp;)<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(1,LEFT(@sj1,4),RIGHT(@sj1,4)&nbsp;)<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(2,LEFT(@sj2,4),RIGHT(@sj2,4)&nbsp;)<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(3,LEFT(@sj3,4),RIGHT(@sj3,4)&nbsp;)<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(4,cast(LEFT(@sbfw,3)&nbsp;as&nbsp;integer),cast(RIGHT(@sbfw,3)as&nbsp;integer))<br> insert&nbsp;into&nbsp;&nbsp;##A&nbsp;(id,a,b)&nbsp;values&nbsp;(5,cast(LEFT(@xbfw,3)&nbsp;as&nbsp;integer),cast(RIGHT(@xbfw,3)&nbsp;as&nbsp;integer))
 
后退
顶部