• 对sqlserver存储过程合游标循环中的一点心得


      在这次要求的任务中,老大要我用存储过程和游标做一些数据处理。刚开始听完介绍,我完全没有头绪。太久没有接触存储过程合游标大半部分都忘了,所以刚开始在网上百度和看各种实例博客分析。觉得存储过程就是将存储不同的sql语句合操作的结果集,而游标表示就是就爱那个将结果集一条条遍例出来。看着挺简单的,实际上上手操作发现因为完全没有事先分析导致思路不清楚,写着写着就进了误区,将自己活活逼死在死胡同。

      这次的要求相当于是在一张原型表中进行数据的操作,首先用sql语句将表中数据进行初步处理后插入到新表中。这里我犯了一个错误,因为之前接触到的sql语句都是简单的增删改操作,所以第一反应就是先用select查出数据再insert到新表中。但是在存储过程中怎么同时执行两个sql语句呢,我想到了游标循环插入的办法,这个方法虽然解决了我要将数据插入到新表中的问题,但是在后面会有一个大的问题。那就是我不太了解游标循环,所以我用了嵌套循环的方法去执行后面的操作。但这样就带来新的问题,我后面进行的操作是根据客户ID的不同对其中某些字段进行数据处理,在游标中进行这样的处理只需要根据客户不同循环就可以了,但因为我在最外面用游标去循环插入数据了,所以我在对不同客户指定字段循环时会受到外层游标循环的影响,它会在内层游标循环结束后根据外层游标在循环一次。这样就会有重复数据出现,甚至会出现一些奇怪的数据

      后来我死憋不出来的时候老大过来查看进度,我说了我的困惑,他给我指出sql语句可以直接将select的结果当作values后面的数据插入。这样就节省了我的外层游标,但因为我不太清楚游标的使用方法,后面对具体字段进行处理操作时我用到了双层游标循环嵌套,当然这样做也没有得到想要的结果。因为后面具体字段分析处理是会关联一张计算表和一张区分表,这两张表都要进行条件语句判断才能通过update更新数据。双层游标嵌套的结果是会造成数据重叠和失误,这个问题困扰了我几天,后来还是公司大神指点才明白,游标循环相当于对数据表从上到下逐条遍历查询,游标是可以分开来使用的,循环就相当于while条件 。明白了这一点我才学会怎么将两种处理方式分开使用,在后面对相同客户处理结束后要对之前累计数据清零方便进行下一个客户的计算,这里我又困惑了。该根据什么来判断这一条客户ID和下一条客户ID是不同的呢?通过网上查找和论坛提问我知道了要用变量,定义一个变量去表诉每一条游标,让它去等于客户ID,当当前客户ID值不等于变量值时表示进入下一客户操作中。通过这样我大致解决了老大的要求,只是过程比较复杂,前期过于自负问的少所以问题很多。这次相当于从不熟到慢慢来理解的一个过程,对于我来说是一种学习和锻炼的过程,相信后面会越来越好的

  • 相关阅读:
    ros结合catkin_make和qtcreator
    构造函数隐式转换
    c语言自动对齐原则
    array数据初始化
    const 作用
    ~scanf()
    c++ set容器排序准则
    设置session,cookies
    JFinalConfig配置
    java重置Timer执行频率
  • 原文地址:https://www.cnblogs.com/SH03/p/5182532.html
Copyright © 2020-2023  润新知