注册 登录
编程论坛 SQL Server论坛

SQL SERVER游标问题--所请求的行不在提取缓冲区内

qianliemao 发布于 2010-01-30 21:03, 937 次点击
请帮我看看下面的游标有什么问题:
说明:tab表中有字段ID,adress.现在要重新编排ID,adress列相同的记录共用同一个ID.第一条记录的ID已经确定为1,往后依次递增.

declare cur_tab cursor scroll for   
select ID,address from tab
for update of ID
declare @xuhao1 varchar(15),@xuhao2 varchar(15),@addr1 varchar(15),@addr2 varchar(15)
open cur_tab
fetch next from cur_tab into @xuhao1,@addr1
while @@fetch_status=0
begin  
  fetch next from cur_tab into @xuhao2,@addr2
  if @addr1=@addr2
    update tab set ID=@xuhao1 where current of cur_tab
  else
    update tab set ID=@xuhao1+1 where current of cur_tab
  set @xuhao1=@xuhao2
  set @addr1=@addr2
end
close cur_tab                        
deallocate cur_tab  


执行结果有这样的提示:

执行结果报错:
服务器: 消息 16930,级别 16,状态 1,行 10
所请求的行不在提取缓冲区内。
语句已终止。

查看结果,发现只增加了一个新的ID.这样看来是没有正常循环,但是又找不到哪里有毛病,哪位帮我看看,谢谢!
3 回复
#2
cnfarer2010-01-31 13:56

IF OBJECT_ID ('dbo.Tab', 'U') IS NOT NULL
    DROP TABLE dbo.Tab;
GO
CREATE TABLE dbo.Tab
    (id varchar(15), address varchar(15));
GO
INSERT INTO dbo.Tab VALUES ('1', '10');
INSERT INTO dbo.Tab VALUES ('2', '10');
INSERT INTO dbo.Tab VALUES ('3', '10');
INSERT INTO dbo.Tab VALUES ('4', '40');
GO

declare cur_tab cursor for   
select ID,address from tab
for update of ID
open cur_tab

declare @xuhao1 varchar(15),@xuhao2 varchar(15),@addr1 varchar(15),@addr2 varchar(15)
fetch next from cur_tab into @xuhao1,@addr1
fetch next from cur_tab into @xuhao2,@addr2
while @@fetch_status=0
begin  
 
  if @addr1=@addr2
    update tab set ID=@xuhao1 where current of cur_tab
  else
    update tab set ID=@xuhao1+1 where current of cur_tab
  set @xuhao1=@xuhao2
  set @addr1=@addr2
  fetch next from cur_tab into @xuhao2,@addr2
end
close cur_tab                        
deallocate cur_tab  
#3
qianliemao2010-01-31 15:59
谢谢楼上,这样不报错,不过结果还是不对.
按楼上给的测试数据,执行结果中ID 应该依次为 1,1,1,2
但是实际执行结果是:                        1,1,2,3

可见还是没有达到目的!
#4
cnfarer2010-02-01 08:02
那是你的算法有问题(按照你写的东西,就是这样的结果)加上红色部分就行了
declare cur_tab cursor for   
select ID,address from tab
for update of ID
open cur_tab

declare @xuhao1 varchar(15),@xuhao2 varchar(15),@addr1 varchar(15),@addr2 varchar(15)
fetch next from cur_tab into @xuhao1,@addr1
fetch next from cur_tab into @xuhao2,@addr2
while @@fetch_status=0
begin  

  if @addr1=@addr2
    update tab set ID=@xuhao1 where current of cur_tab
  else
begin
    update tab set ID=@xuhao1+1 where current of cur_tab
  set @xuhao1=@xuhao1+1
  set @addr1=@addr2
end
  fetch next from cur_tab into @xuhao2,@addr2
end
close cur_tab                        
deallocate cur_tab   

[ 本帖最后由 cnfarer 于 2010-2-2 05:34 编辑 ]
1