如下表
create table t1
(
 indate  datetime,
  m1     numeric(10,2)
)
数据如下
 2005-11-01   1000.05
 2005-05-01   6500.50
 2006-01-01   10035.50
 2004-05-09   20350.00
...
用update语句对m1进行处理,但是必须按照indate的时间先后进行处理。也就是说处理记录的先后顺序必须如下
2004-05-09
2005-05-01
2005-11-01
2006-01-01
...
请问不用游标如何实现?

解决方案 »

  1.   

    SELECT TOP  8000 id = IDENTITY(int,1,1) INTO #A FROM syscolumns
    SELECT *,identity(int,1,1) as id INTO #B FROM t1 order by indate 
    Update t1
    set m1=所要处理的操作
    where #A.id=#B.id
    Drop #A
    Drop #B
    -------
    性能不好
    期待高手
      

  2.   

    按楼上兄弟的办法,不如直接把表按照indate排序一下就可以了。
    但是t1如果很多的记录,处理起来太耗时吧
      

  3.   

    select *  into #t1_t from t1 order by indate -- where....
    update #t1_t  set #t1_t.m1 = #t1_t.m1 + 0.5
    delete t1 -- where.....
    insert t1 select * from #t1_t
    drop table #t1_t考查其实质性过程:
    更新动作将在原表或者原表索引上搜索符合where记录出来到缓存区,而这一过程和搜索出来的数据将是顺序进行和按物理顺序的(也即是update ... where 后面不能跟order by,它将从原表或者索引表自上而下逐行匹配where条件,符合的就抽取出来放到缓存区).更新数据时,就对缓存区数据逐条顺序更改.更改完毕回写数据表时,也是自上而下顺序回写.基于上述理解,认为除非能改变update缓存区的先后顺序,才有可能实现update的先后顺序.而目前只能自行虚拟建立这个过程.(即先把要update的数据按更新顺序缓存到临时表,再对临时表进行update动作,最后回写到原表)濡染理解得不对,请多多指教:)