首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sqlSever 游标更新时报错:游标只读,该怎么处理

2013-09-25 
sqlSever 游标更新时报错:游标只读DECLARE @CauseCode VARCHAR(10) ,@ProtocolCode VARCHAR(10) ,@line VA

sqlSever 游标更新时报错:游标只读


DECLARE @CauseCode VARCHAR(10) ,
    @ProtocolCode VARCHAR(10) ,
    @line VARCHAR(20) ,
    @tmp VARCHAR(10)
DECLARE mycur   CURSOR
FOR
    SELECT  ROW_NUMBER() OVER ( ORDER BY t.AUTHReqTime ASC ) ,
            t.CauseCode ,
            t.ProtocolCode
    FROM    T_WLan_CDR_Portal t FOR UPDATE 
BEGIN
    OPEN mycur ;
    FETCH NEXT FROM mycur INTO @line, @CauseCode, @ProtocolCode ;
   
    WHILE @@FETCH_STATUS = 0 
        BEGIN
            PRINT '行号:' + @line + '协议码:' + @ProtocolCode + ' 错误码:'
                + @CauseCode ;
            
            SET @tmp = @ProtocolCode ;
            SET @ProtocolCode = @CauseCode ;
            SET @CauseCode = @tmp ;
            
            PRINT '行号:' + @line + '协议码:' + @ProtocolCode + ' 错误码:'
                + @CauseCode ;
             
            UPDATE  T_WLan_CDR_Portal
            SET     CauseCode = @ProtocolCode ,
                    ProtocolCode = @CauseCode
            WHERE CURRENT OF mycur ;
             
            FETCH NEXT FROM mycur INTO @line, @CauseCode, @ProtocolCode ;


        END
        
        
    CLOSE mycur ;
    DEALLOCATE mycur ;
END



行号:1协议码:22 错误码:210
行号:1协议码:210 错误码:22
消息 16929,级别 16,状态 1,第 28 行
游标是只读的。

这是怎么会
[解决办法]
抱歉.前面以为是静态游标的问题,但不是.
你这个游标用了函数row_number来设置行号,实际上,更新是由行号作标志的,由于row_number函数获得的是表以外的一个标志,因此,类似这样的查询语句,不能作为可更新的游标来使用.
检查了一下你的示例,只是简单地将两列互换,如是这样的话,可以不用游标,直接:
alter table T_WLan_CDR_Portal add ProtocolCodeTemp int
update table T_WLan_CDR_Portal set ProtocolCodeTemp=CauseCode
alter table drop column CauseCode
exec sp_rename 'T_WLan_CDR_Portal.ProtocolCode','CauseCode','COLUMN'
exec sp_rename 'T_WLan_CDR_Portal.ProtocolCodeTemp','ProtocolCode','COLUMN'

热点排行
Bad Request.