我不知道为什么,但我知道怎么做!
你将表名的"#"去掉即可.DECLARE MyCursor  CURSOR  
FOR SELECT TOP 100 PERCENT Direction ,Debit,Credit,EndAmount,Flag 
FROM tmpCross WHERE tmpcross.Flag=1 or tmpcross.Flag=0
order by voucherperiod,flag
FOR UPDATE 

解决方案 »

  1.   

    我指的是建立临时表tmpCross代替#tmpCross
      

  2.   

    好象是跟游标的隐性转换有关,order by ...可能导致游标变成静态游标(只读),从而不能指定 FOR UPDATE ,具体你再看看帮助吧。
      

  3.   

    下面是我的测试例子,各位不妨试试:
    使用一个定义在一个叫做物品代码库(wpdmk)上的游标,其中wpdmk有wpbm,wpmc,wpysbm等字段.
    然后Select * into #wpdmk from wpdmk
    运行两段只有细微差别的批处理,得到不同的结果:
    1.报错,
    2.正确.附:
    1.
    Declare @wpbm varchar(10)
    Declare @wpmc varchar(20)
    DECLARE MyCursor  CURSOR  
    FOR SELECT  wpbm,wpmc
    FROM #wpdmk WHERE wplxbm='01'  order by wpbm
    FOR UPDATE 
    open MyCursor
    fetch mycursor into @wpbm,@wpmc
    while (@@fetch_status=0)
    begin
        If ltrim(rtrim(@wpbm))='0001'
          update #wpdmk set wpysbm='01' WHERE CURRENT OF mycursor   fetch mycursor into @wpbm,@wpmc
       
    end
    close MyCursor
    deallocate MyCursor
    会出现:
    "服务器: 消息 16929,级别 16,状态 4,行 6
    The cursor is READ ONLY."2.
    Declare @wpbm varchar(10)
    Declare @wpmc varchar(20)
    DECLARE MyCursor  CURSOR  
    FOR SELECT  wpbm,wpmc
    FROM wpdmk WHERE wplxbm='01'  order by wpbm
    FOR UPDATE 
    open MyCursor
    fetch mycursor into @wpbm,@wpmc
    while (@@fetch_status=0)
    begin
       --select @wpbm,@wpmc
       If ltrim(rtrim(@wpbm))='0001'
          update wpdmk set wpysbm='01' WHERE CURRENT OF mycursor   fetch mycursor into @wpbm,@wpmc
       
    end
    close MyCursor
    deallocate MyCursor结果:"(所影响的行数为 1 行)"我也等待着合理的解释.
      

  4.   

    大家在使用游标时没有使用过ORDER BY 子句吗?
      

  5.   

    你使用order by 产生的结果集为只读。
    sql server和oracle 都是这样。
    此题无解,除非使用中间表。