| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 937 人关注过本帖
标题:SQL SERVER游标问题--所请求的行不在提取缓冲区内
只看楼主 加入收藏
qianliemao
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-1-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
SQL SERVER游标问题--所请求的行不在提取缓冲区内
请帮我看看下面的游标有什么问题:
说明: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.这样看来是没有正常循环,但是又找不到哪里有毛病,哪位帮我看看,谢谢!
搜索更多相关主题的帖子: SERVER 游标 SQL 请求 缓冲 
2010-01-30 21:03
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:8 

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  

★★★★★为人民服务★★★★★
2010-01-31 13:56
qianliemao
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-1-30
收藏
得分:0 
谢谢楼上,这样不报错,不过结果还是不对.
按楼上给的测试数据,执行结果中ID 应该依次为 1,1,1,2
但是实际执行结果是:                        1,1,2,3

可见还是没有达到目的!
2010-01-31 15:59
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:12 
那是你的算法有问题(按照你写的东西,就是这样的结果)加上红色部分就行了
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 编辑 ]

★★★★★为人民服务★★★★★
2010-02-01 08:02
快速回复:SQL SERVER游标问题--所请求的行不在提取缓冲区内
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012015 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved