mssql2000游标循环次数对不上,如何解决??

2024-08-24 10:36

本文主要是介绍mssql2000游标循环次数对不上,如何解决??,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  mssql2000游标循环次数对不上。

CREATE proc usp_ins_requisite_sc @bill char(16),@stateman varchar(50)  
as  
begin  declare @rowno char(8),@row_id char(8),@bombill varchar(50)declare temp_cursor cursor for   select distinct(y.bombill),isnull(y.row_id,''),isnull(y.rowno,'') from vw_salebill x,t_bombill y where x.bill=@bill and x.itemcode=substring(y.fatherbill,1,10) and y.workname is not null   and y.itemcode like '7%'  and y.workname not in ('06','01')  and isnull(y.type,'1') <> '0'open temp_cursor  fetch next from temp_cursor into @bombill,@row_id,@rowno --   while @@fetch_status = 0  begin--    select @fatherbill = x.itemcode from vw_salebill x,t_bombill y 
--    where x.bill=@bill and x.itemcode=y.fatherbill and y.itemtype='1'   if @row_id = ''
begininsert into t_requisite_sc (salebill,orderbill,custcode,custname,rundate,senddate,  prodcode,oldprodcode,prodname,prodmodel,  prodstandards,prodnum,wdep,odep,cdep,  fnum,sfanum,prepnum,itemcode,oldcode,  itemnum,workstep,applynum,plannum,type,state,billman,billdate,remark,cremark,bomunit,bomnum,color,cloth,wstuff,gild,workname,stuff,outdate,unitcode)  select  x.bill+x.rowno,x.orderbill,x.cust_code,x.cust_name,x.statedate,x.senddate1,  x.itemcode,x.oldcode,x.itemname,x.itemmodel,  x.standards,x.itemnum,x.wdep,x.odep,x.cdep,  x.fnum,x.sfanum,x.prepnum,y.itemid,y.itemcode,  x.itemnum*y.itemnum,y.workstep,x.itemnum*y.itemnum,0,'1','0',@stateman,getdate(),x.remark,dbo.uf_getcremark(itemid) ,y.bomunit,y.bomnum,dbo.uf_getcolor(y.itemid),dbo.uf_getcloth(y.itemid),x.wstuff,x.gild, CASE y.workname WHEN '04'  THEN 'D021' WHEN '05'  THEN 'D022'  WHEN '06'  THEN 'D017'  WHEN '16'  THEN 'D018'  WHEN '18'  THEN 'D019'   WHEN '20'  THEN 'D020'   WHEN '25'  THEN 'D043'   WHEN '30'  THEN 'D024'   WHEN '01'  THEN '0000'   WHEN '54'  THEN 'D054'    WHEN '55'  THEN 'D055'    WHEN '56'  THEN 'D056'    WHEN '57'  THEN 'D057'   end,stuff,outdate,y.unitcodefrom vw_salebill x,t_bombill y  where x.bill=@billand x.itemcode=substring(y.fatherbill,1,10)  and y.workname is not null   and y.itemcode like '7%'    and y.workname not in ('06')  and isnull(y.type,'1') <> '0'--   and substring(bombill,1,13) in (select  y.bombill from vw_salebill x,t_bombill y where x.bill=@bill and substring(y.fatherbill,1,10) like x.itemcode and produce_type='2'  and y.itemcode like '7%' )endif @rowno = ''
begininsert into t_requisite_sc(salebill,orderbill,custcode,custname,rundate,senddate,  prodcode,oldprodcode,prodname,prodmodel,  prodstandards,prodnum,wdep,odep,cdep,  fnum,sfanum,prepnum,itemcode,oldcode,  itemnum,workstep,applynum,plannum,type,state,billman,billdate,remark,cremark,bomunit,bomnum,color,cloth,wstuff,gild,workname,stuff,outdate,unitcode)  select  x.bill+x.rowno,x.orderbill,x.cust_code,x.cust_name,x.statedate,x.senddate1,  x.itemcode,x.oldcode,x.itemname,x.itemmodel,  x.standards,x.itemnum,x.wdep,x.odep,x.cdep,  x.fnum,x.sfanum,x.prepnum,y.itemid,y.itemcode,  x.itemnum*y.itemnum,y.workstep,x.itemnum*y.itemnum,0,'1','0',@stateman,getdate(),x.remark,dbo.uf_getcremark(itemid) ,y.bomunit,y.bomnum,dbo.uf_getcolor_p(y.itemid),dbo.uf_getcloth(y.itemid),x.wstuff,x.gild, CASE y.workname WHEN '04'  THEN 'D021' WHEN '05'  THEN 'D022'  WHEN '06'  THEN 'D017'  WHEN '16'  THEN 'D018'  WHEN '18'  THEN 'D019'   WHEN '20'  THEN 'D020'   WHEN '25'  THEN 'D043'   WHEN '30'  THEN 'D024'   WHEN '01'  
THEN '0000'   WHEN '54'  THEN 'D054'    WHEN '55'  THEN 'D055'    WHEN '56'  THEN 'D056'    WHEN '57'  THEN 'D057'  end,stuff,outdate,y.unitcodefrom vw_salebill x,t_bombill y  where x.bill=@bill  and x.itemcode=substring(y.fatherbill,1,10)    and y.workname is not null  and y.itemcode like '7%'   and y.workname not in ('06')  and isnull(y.type,'1') <> '0'-- and produce_type<>'2'
--        and substring(bombill,1,13) in (select  y.bombill from vw_salebill x,t_bombill y where x.bill=@bill and substring(y.fatherbill,1,10) like x.itemcode and produce_type='2'  and y.itemcode like '7%' )endfetch next from temp_cursor into @bombill,@row_id,@rowno end  close temp_cursor  deallocate temp_cursor     
end  

祖传存储过程,mssql2000,这玩意游标实际查询的时候90条以上的数据,@row_id全部为null,@rowno全部不为null,但是游标实际只执行了一次,是不是我哪里看漏了,不然90条的记录游标只循环一次我无法理解啊。

友情提示:
  如上问题有的来自我自身项目开发,有的收集网站,有的来自读者…如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。

解决方案

  如下是上述问题的解决方案,仅供参考:

  在 SQL Server 2000 中,游标操作是一个常见的问题,特别是当涉及到对大量数据的处理时。从你提供的存储过程代码来看,有几个可能的原因导致游标循环次数不符合预期:

  1. FETCH_STATUS 检查: 你的代码中注释掉了 @@fetch_status = 0 的检查。这是非常重要的,因为 @@fetch_status 会告诉你上一次 FETCH 操作是否成功。如果没有检查 @@fetch_status,游标可能会在遇到第一条数据后立即停止。你需要取消注释并使用这个检查来确保循环继续执行。

  2. FETCH NEXT: 确保每次循环结束时都调用了 FETCH NEXT 来获取下一条记录。如果 FETCH NEXT 没有被正确调用,循环将不会继续。

  3. WHERE 子句逻辑: 检查你的 WHERE 子句逻辑是否正确。如果 WHERE 子句中的条件导致没有记录被选中,游标将不会执行循环。

  4. 变量初始化: 确保在游标打开之前,所有相关的变量都已经正确初始化。如果 @row_id@rowno 在游标开始之前就被设置为特定的值,这可能会影响循环的逻辑。

  5. 错误处理: 检查是否有任何错误处理逻辑(例如 TRY...CATCH)可能在游标执行过程中被触发,这可能会导致游标提前结束。

  6. 性能问题: 如果查询本身非常慢,或者服务器性能问题,可能会给人一种游标只执行了一次的错觉。检查服务器性能和查询执行时间。

  7. 调试: 你可以在 FETCH 操作后添加一些调试输出,比如打印当前的 @bombill, @row_id, 和 @rowno,以确保循环按预期进行。

  8. 游标声明: 检查游标的声明是否有问题,比如是否正确地声明了所有需要的列。

  9. 事务: 如果存储过程中有事务的使用,确保事务的使用是正确的,并且没有因为某些原因导致游标提前结束。

  10. 死锁或锁定问题: 检查是否有死锁或锁定问题导致游标执行被阻塞。

最后,由于 SQL Server 2000 是一个非常老的版本,可能存在一些已知的 bug 或限制,这可能也会影响游标的正常工作。如果可能的话,考虑升级到较新的 SQL Server 版本,以获得更好的性能和稳定性。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


这篇关于mssql2000游标循环次数对不上,如何解决??的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102233

相关文章

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Mysql DATETIME 毫秒坑的解决

《MysqlDATETIME毫秒坑的解决》本文主要介绍了MysqlDATETIME毫秒坑的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 今天写代码突发一个诡异的 bug,代码逻辑大概如下。1. 新增退款单记录boolean save = s

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修