读书人

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

发布时间: 2013-09-25 11:02:59 作者: rapoo

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'

读书人网 >SQL Server

热点推荐