SQLserver数据库篇

2023-02-21 00:00:00 获取 游标 明细 表头 单据
今天领导下发一个任务,让我查找销售交货单中的明细并且做相互比较,如果其中有两条明细的物料编码前四位不一致,那么输出此单据
接到任务时,我觉得挺简单的,不就是表之间的联查吗,我会!之后马上打开数据库,联查销售交货表,发现貌似表头连接表体之后,表体里面的数据明细无法作比较!what f***!

之后马上想到要用游标操作,操作思想如下:

1、先用游标获取每条表头的ID号,并用表头ID去定位表体明细,取出条明细保存;
2、然后再去取出第二条明细,让其与条明细对比,若一致,则循环取出该单据的下一条明细;若不一致,则直接打印输出,并获取下一个单据进行循环;
3、重复执行1,2过程,直到游标的@@FETCH_STATUS值不为0。



使用此操作马上就能得出结果


后来一检查,发现貌似有点不对!我的心情就像是坐了过山车一样,还能怎么办,接着检查呗。后检查半天发现原来是这个小东西惹的祸:
先来看下面的例子:

    DECLARE @aaa varchar(10)


    SET @aaa = 'nihao'


    select @aaa = tab.name from SysObjects as tab where 1=2


    PRINT @aaa


    -- 预期结果为: (空字符)


    -- 输出结果为:nihao


    -- 没想到啊,就这个小东西让我找了半天!








    这次也是细节问题,我获取明细值的时候没有重置,就去获取下一个明细的值,假如下一个明细的值为空,那错误就会发生。因此,在使用变量前记得要初始化或者重置!
    游标操作的使用方法我从官网粘一份,如下:

      DECLARE @bolid varchar(30), @bolcode varchar(30), @row int


      -- 声明游标


      DECLARE string_find_cursor CURSOR FAST_FORWARD 


      FOR select_statement;


      -- 打开游标


      OPEN string_find_cursor;


      -- 获取游标的值,分别赋给@bolcode,@bolid,@row


      FETCH NEXT FROM string_find_cursor


      INTO @bolcode,@bolid,@row;


      -- 获取游标状态,如果为0则继续执行,否则结束while循环


      WHILE @@FETCH_STATUS = 0


      BEGIN


          /* 执行要实现某些功能的语句 */


          FETCH NEXT FROM string_find_cursor


          INTO @bolcode,@bolid,@row;


      END;  


      -- 关闭游标


      CLOSE string_find_cursor;


      -- 释放游标的内存


      DEALLOCATE string_find_cursor;






      相关文章