问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sqlserver存储过程中使用游标,查询结果没有第一条数据,但循环次数是...

发布网友 发布时间:2022-04-23 02:40

我来回答

3个回答

懂视网 时间:2022-04-09 02:22

插入客户信息 create synonym synonym_project for [192.168.159.134].[VisualNet].[dbo].project declare @prjkey varchar(50) declare @customername varchar(50) declare @khbh char(4) declare cursor_project cursor for select prjname,prjkey from synonym_project open cursor_project fetch next from cursor_project into @customername,@prjkey if not exists(select 1 from Customers where gsmc = @customername) select @khbh = MAX(khbh)+1 from Customers insert into Customers(khbh,gsmc,gsdz,gsdh) values(@khbh,@customername,‘‘,‘‘) while @@FETCH_STATUS=0 begin fetch next from cursor_project into @customername,@prjkey if not exists(select 1 from Customers where gsmc = @customername) select @khbh = MAX(khbh)+1 from Customers insert into Customers(khbh,gsmc,gsdz,gsdh) values(@khbh,@customername,‘‘,‘‘) end close cursor_project deallocate cursor_project drop synonym synonym_project

  这里使用同义词和游标远程查询数据。

 

  因为:

open cursor_project

fetch next from cursor_project into @customername,@prjkey

  打开游标后需要先取一条数据才能进行while循环读取,所以我在取到数据后进行插入操作 

  然后while循环中也会再进行数据读取,在读取后再进行插入操作。

 

  但是执行后发生错误:违反唯一约束

  我查看了远程表,所有的数据都完整的插入到表中,并没有遗失的数据,不知道从哪里多了一条数据,所以讲数据处理换为打印查看数据: 

--插入客户信息
create synonym synonym_project for [192.168.159.134].[VisualNet].[dbo].project
declare @prjkey varchar(50)
declare @customername varchar(50)
declare @khbh char(4)

declare cursor_project cursor for
select prjname,prjkey from synonym_project

open cursor_project

fetch next from cursor_project into @customername,@prjkey
print @customername

while @@FETCH_STATUS=0
begin
 fetch next from cursor_project into @customername,@prjkey
 print @customername
 
end

close cursor_project
deallocate cursor_project

drop synonym synonym_project

  结果如下:

Test1      
南通心智慧     
港闸区      
港闸区 

  但是在远程表中‘港闸区‘只有一个,所以是最后一条数据重复了,然后百度一下看看别人是不是出现过:http://zhidao.baidu.com/link?url=wNi65XcABENt3DV_VJJHILlHWTNYdsMYzX7b25RmGACPIwsLjAUkWVz0qIFzlfwC7fK5S5-71t5196I5wJ4gRa

 

  回答是说取数据应该是在while后面,所以我把游标获取数据放在循环最后: 

--插入客户信息
create synonym synonym_project for [192.168.159.134].[VisualNet].[dbo].project
declare @prjkey varchar(50)
declare @customername varchar(50)
declare @khbh char(4)

declare cursor_project cursor for
select prjname,prjkey from synonym_project

open cursor_project

fetch next from cursor_project into @customername,@prjkey
print @customername

while @@FETCH_STATUS=0
begin
 
 print @customername
 fetch next from cursor_project into @customername,@prjkey
end

close cursor_project
deallocate cursor_project

drop synonym synonym_project

  运行结果:

Test1      
Test1      
南通心智慧     
港闸区      

  发现第一条数据重复,也就是说两次打印有一次是多余的,因为要遍历数据,所以循环里面的打印肯定是必须的,上面的打印可能是多余的,如果把上面的打印删除,游标取数据在打印之后,循环内部打印在游标取数据之前,就不会有上一条数据丢失:

--插入客户信息
create synonym synonym_project for [192.168.159.134].[VisualNet].[dbo].project
declare @prjkey varchar(50)
declare @customername varchar(50)
declare @khbh char(4)

declare cursor_project cursor for
select prjname,prjkey from synonym_project

open cursor_project

fetch next from cursor_project into @customername,@prjkey

while @@FETCH_STATUS=0
begin
 
 print @customername
 fetch next from cursor_project into @customername,@prjkey
end

close cursor_project
deallocate cursor_project

drop synonym synonym_project

  结果如下:

Test1      
南通心智慧     
港闸区      

  这样就正确了,相同于打印, 对数据进行插入操作的逻辑也是这样,讲打印改成需要的数据操作:

--插入客户信息
 create synonym synonym_project for [192.168.159.134].[VisualNet].[dbo].project
 declare @prjkey varchar(50)
 declare @customername varchar(50)
 declare @khbh char(4)
 
 declare cursor_project cursor for
 select prjname,prjkey from synonym_project
 
 open cursor_project
 
 fetch next from cursor_project into @customername,@prjkey
 
 while @@FETCH_STATUS=0
 begin
  
  if not exists(select 1 from Customers where gsmc = @customername)
  select @khbh = MAX(khbh)+1 from Customers
  insert into Customers(khbh,gsmc,gsdz,gsdh) values(@khbh,@customername,‘‘,‘‘)
  fetch next from cursor_project into @customername,@prjkey
 end
 
 close cursor_project
 deallocate cursor_project

  这样就正确了,对游标使用很少经常会出现这个问题,因为普通的逻辑就会出现最后数据重复,必须使用游标的逻辑格式。

 

sqlserver游标使用误区

标签:

热心网友 时间:2022-04-08 23:30

将fetch next from mycursor into @i,@name
放在while循环体的最后即可,即:
while(@fetch_status=0)
begin
print 'id: '+@i+ ' name: '+@name
fetch next from mycursor into @i,@name
end
这样应该就可以了。

热心网友 时间:2022-04-09 00:48

尝试下把你的数据库打下SP4补丁
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 请教一个SQL语句 SQL语句,高分请教!帮忙解决这个棘手的问题! 用mapbasic中 求解释每一句,特别fetch first from asdf,运行时显示找不到sadf文件,怎么解决。。 这是一个SQL游标,为什么要在BEGIN和END里面再写一遍fetch next from mycursor into @O_ID,@A_Salary ? 请高手帮忙优化一下这条SQL语句 游标取数为什么要用两次FETCH NEXT FROM INTO语句 游标取数为什么要用两次FETCH NEXT FROM INTO语句? FETCH NEXT FROM是啥意思 为什么手机内部存储空间不足? 手机内部存储空间是什么意思? 手机内部存储空间不足怎么清理? 手机系统空间和内部储存空间有什么区别啊? 手机的外部储存空间指的是什么?内部空间又是什么? 手机的内部存储空间是什么意思? 清蒸三文鱼怎么做好吃,清蒸三文鱼的家常做法 三文鱼的多种做法? 三文鱼有什么做法大全 三文鱼怎么吃,简单点做法 三文鱼咋做? 三纹鱼怎么做家常做法 求解sql语句 sql fetch提取数据常用方法 SQL Server2000游标循环,如何修改,可使两条fetch语句变成一条 麻烦大神,SQL语句分析一下 关于sql中@@fetch_status的问题 为学生基本信息表S中男同学的行声明游标,并使用FETCH NEXT逐个提取这些行? SQL数据库问题 解释一下下面的代码 怎样改变游标状态变量@@fetch_status的值? SQL FETCH fetch 响应时间怎么设置 @@FETCH_STATUS是什么意思啊? 《山河令》中温客行顾湘兄妹情有哪些让你感动的情节? 如何评价周也在电视剧《山河令》中的表现? 《山河令》有哪些细节嗑点? 山河令中顾湘的演技如何? 温客行吐血靠在周子舒怀里视频第几集 阿湘大婚,却被莫怀阳所杀,死在了温客行怀里 ,阿湘最后大仇得报了吗? 《山河令》阿湘的死上了热搜,她死得有多惨? 顾湘身份暴露,她究竟战队哪边? 《山河令》大结局,阿湘究竟是如何惨死的?