select *
from bmb
---------
--仓库分类    产品名称        单位     核算分类
--床扎销子    1#床扎          付     定单五金
--床扎销子   3#床扎          付     Null
--螺丝螺母 加大垫圈6mm(黑)    千件 定单五金
--螺丝螺母 8mm古铜垫片             千件 Null
--电工电器 交流电磁开关HKO-11    只      本厂维修
--电工电器 交流电磁开关HKO-35     只      Null--×××需求:
--通过【仓库分类】循环update 【核算分类】里的 null,当【仓库分类】is null 时跳过。---以前方法,不能够循环
select top 1 *
from bmb
where 核算分类 is null
--
update bmb
set 核算分类='定单五金'
where 仓库分类 = '床扎销子' and 核算分类 is null

解决方案 »

  1.   

    declare @h varchar(20)
    update bmb set 核算分类=@h,@h=isnull(@h,核算分类)
      

  2.   

    create table bmb(仓库分类 varchar(20),      产品名称   varchar(20),        单位 varchar(10),       核算分类 varchar(20))
    insert bmb select '床扎销子',       '1#床扎',             '付'   ,     '定单五金'
    insert bmb select '床扎销子',      '3#床扎',             '付'     ,   Null
    insert bmb select '螺丝螺母',    '加大垫圈6mm(黑)' ,      '千件'  ,  '定单五金'
    insert bmb select '螺丝螺母',    '8mm古铜垫片'        ,        '千件' ,   Null
    insert bmb select '电工电器',   '交流电磁开关HKO-11'   ,    '只'     ,    '本厂维修'
    insert bmb select '电工电器',    '交流电磁开关HKO-35'   ,     '只'    ,     Nulldeclare @h varchar(20)
    update bmb set 核算分类=@h,@h=isnull(核算分类,@h)select * from bmbdrop table bmb仓库分类                 产品名称                 单位         核算分类
    -------------------- -------------------- ---------- --------------------
    床扎销子                 1#床扎                 付          定单五金
    床扎销子                 3#床扎                 付          定单五金
    螺丝螺母                 加大垫圈6mm(黑)           千件         定单五金
    螺丝螺母                 8mm古铜垫片              千件         定单五金
    电工电器                 交流电磁开关HKO-11         只          本厂维修
    电工电器                 交流电磁开关HKO-35         只          本厂维修(6 行受影响)
      

  3.   

    通过这一句就可以达到效果,但是不明白什么原理。
    所有记录数有2万多,现在发现一些新情况,单独靠通过【仓库分类】对应的【核算分类】是判断更新的空值有些情况下是错误的。
    而是需要通过【存货编码】列里的部分字符串对应的非空【核算分类】来判断更新【核算分类】空值
    部分字符串有这样的规律,是全数字型的取前3位,数字字母混合的取字母,具体如【辅助列】。
    在excel里面可以通过函数取出辅助列,然后筛选辅助列拖拽核算分类列来完成。
    实例数据:
    存货代码 辅助列 仓库分类 产品名称         单位 核算分类
    0012389 001 纸箱 KP84QS-PS52-2-2 只 null
    0012390 001 纸箱 QS727PS727-3-2 只 纸箱
    0012392 001 纸箱 KS727QS727-3-1 只 null
    0012393 001 纸箱 KS727QS727-3-2 只 null
    0012394 001 纸箱 QS727QS727-3-1 只 纸箱
    H189 H 螺丝螺母 8.5*28*20垫片 只 null
    H187 H 螺丝螺母 弹簧垫片5mm 千件 订单五金
    DG0819 DG 电工电器 尼龙扎带300*5 根 维修
    DG0820 DG 电工电器 尼龙扎带500*8 根 null
    K317 K 刀具 V型刀1/4*2/8 把 null
    K318 K 刀具 进口带锯条 根 工具
      

  4.   

    update a
    set 核算分类 = (select top 1 核算分类 from ta where 存货代码 like left(a.存货代码,case when ascii(a.存货代码)>=65 then 1 else 3 end)+'%' order by 核算分类 desc )
    from ta a
    where a.核算分类  is null
      

  5.   

    update a
    set 核算分类 = b.核算分类
    from ta a,
    (select *,t=left( 存货代码,case when ascii( 存货代码)>=65 then 1 else 3 end) 
     from ta  
     where 核算分类 is not null) b
    where a.核算分类  is null and a.存货代码 like b.t+'%'
      

  6.   

    update a
    set 核算分类 = b.核算分类
    from ta a,
    (select *,t=left( 存货代码,case when ascii( 存货代码)<65 then 3 else ?? end) 
     '??一个是len(存货代码)里的字母,这些字母都在开始处'
    from ta  
     where 核算分类 is not null) b
    where a.核算分类  is null and a.存货代码 like b.t+'%'
      

  7.   


    'google到了,不会修改。
    declare @a varchar(50)
    set @a='2a p9 asdf1234ki  9'
    while patindex('%[^a-z]%',@a)>0
        begin
            set @a=stuff(@a,patindex('%[^a-z]%',@a),1,'')
        end
    select @a
    '
      

  8.   

    存货代码
    0012389
    0012390
    0012392
    0012393
    0012394
    E35
    H189
    H187
    DG0819
    DG0820
    K317
    K318
    B151
    GC0655
    GC0658
    F787
    JB-6
    JL0330
    JL0331
    J140
    J141
      

  9.   

    --写个函数,然后调用。
    create function GetStr(@a varchar(50))
    returns varchar(50)
    as
    begin
    while patindex('%[^a-z]%',@a)>0
    begin
        set @a=stuff(@a,patindex('%[^a-z]%',@a),1,'')
    end
    return @a
    end
    go
    select dbo.getstr('2a p9 asdf1234ki  9')
    go
    /*
    -------------------------------------------------- 
    apasdfki
    */
      

  10.   

    --try:
    update a
    set 核算分类 = b.核算分类
    from ta a,
    (select *,t=left( 存货代码,case when ascii( 存货代码)<65 then 3 else dbo.getstr(存货代码)
     end) 
     --'??一个是len(存货代码)里的字母,这些字母都在开始处'
    from ta  
     where 核算分类 is not null) b
    where a.核算分类  is null and a.存货代码 like b.t+'%'
      

  11.   

    谢谢你的关注,应该说框架已经出来了在六楼。但是六楼里面的left()函数里的1是不准确的。应该是len(出货代码)里的字母部分。