你的代码里是用了with dt as了,不过后面你的用select * from dt 就行了

解决方案 »

  1.   

    大概的格式:
    declare curSchClass cursor 
    for select schName,StartTime,EndTime from d_EmployeeScheduling 
    where UserID=@UserID open curSchClassfetch next from curSchClass into  
    @schName,@StartTime,@EndTimewhile @@FETCH_STATUS = 0
    begin;WITH dt AS (
    SELECT *,ROW_NUMBER()OVER(PARTITION BY [EnterOrOut] ORDER BY [date] )id
    FROM d_Att
    WHERE  
    convert(varchar(5),date,108) between convert(varchar(5),@CheckInTime1,108) and convert(varchar(5),@CheckOutTime2,108)
    and convert(varchar(10),date,121) between convert(varchar(10),@sttime,121) and convert(varchar(10),@edtime,121)
    )
    select *
    from dt--继续取下一条数据
    fetch next from curSchClass into  
    @schName,@StartTime,@EndTimeend 
      

  2.   

    我在游标里使用了
     if @schName='1'
    begin
    ;WITH dt AS (
    SELECT *,ROW_NUMBER()OVER(PARTITION BY [EnterOrOut] ORDER BY [date] )id
    FROM d_Att
    WHERE  
    convert(varchar(5),date,108) between convert(varchar(5),@CheckInTime1,108) and convert(varchar(5),@CheckOutTime2,108)
    and convert(varchar(10),date,121) between convert(varchar(10),@sttime,121) and convert(varchar(10),@edtime,121)
    )
    ....................
    end 
    else if  @schName='2'
    ......................................
    begin end 
    ..................
    少写了一个END.
      

  3.   


    当@schName='1' 和2的时候,会有什么不同的处理方式呢。我觉得你这个还不是太复杂,应该是可以考虑转化成非游标的处理方式的
      

  4.   

    我的游标是提示的一个curSchClass表,这个表是考勤规则好多条,比如说迟到,早退各扣多少分之类的规则.
    然后我在游标里提取的是一个考勤机的记录表,比如说游标走到了迟到的规则那一行数据时,我就对考勤记录进行提取这一考勤时段的第一行数据,然后根据迟到的规则计算他是否迟到,如果迟到,需要扣多少分之类的,
    比如说走到脱岗规则,我就根据这个考勤时段所提取的所有数据,然后对它进行重新排列计算各个按指纹的时间差计算他是否合乎这条规则规定的时间,是否有脱岗之类的.以此类推各个规则来判定.为了计算这个脱岗问题,我昨天还发了贴子,也是版主大人帮忙解决的.http://bbs.csdn.net/topics/390693305
    版主像这样子的怎么解决更有效率,版主提示个思路也行.
      

  5.   

    比较简单的思想是通过两表关联,然后用case when来判断各宗规则,规则应该不会非常多吧,5、6个的话应该不会有什么影响,然后批量判断,除非你的下一条判断是基于上一条,不然的话基本上没必要用到游标
      

  6.   


    当@schName='1' 和2的时候,会有什么不同的处理方式呢。我觉得你这个还不是太复杂,应该是可以考虑转化成非游标的处理方式的处理方式很不同,比如说迟到,需要提取的这一天第一次的数据,看他是否迟到,如果是计算脱冈,就要把这一天的数据全提过来,然后看时间差,等等之类的.
      

  7.   

    游标、临时表是SQL server的珍贵资源,如果有其他方法,能不用尽量不用了
      

  8.   

    把数据筛选处理插入临时表,while exists (expression...)
     select top 1 
    ...
    do something
    ...
    delete from 临时表 where [id]=@id
    不用游标的飘过,我基本上都是用临时表,而且效率上来说要高的多