Fid    type               ffid  idx
01     计算机耗材         00
0101   打印机             01
010101 墨盒               0101
0102   复印机             01
010201 碳粉               0102(三级编码)
FID为物品编码,FFID为该物品所属的上级的类型编码,ffid=00 的 编码 fid为主类型
如:fid=01 的编码我改成 02,则下列相关的编码都要改变为
Fid    type               ffid  idx
02    计算机耗材          00
0201   打印机             02
020101 墨盒               0201
0202   复印机             02
020201 碳粉               0202请问在sqlserver中如何实现修改

解决方案 »

  1.   

    --测试
    create table table1
    (
    Fid varchar(10),
    type varchar(20),
    ffid varchar(10),
    idx varchar(10)
    )insert into table1 select '01',     '计算机耗材',         '00',''
    insert into table1 select '0101',   '打印机',             '01',''
    insert into table1 select '010101', '墨盒' ,              '0101',''
    insert into table1 select '0102',   '复印机',             '01',''
    insert into table1 select '010201', '碳粉'  ,             '0102',''--语句(这里把你原来的id跟新的id都写成了变量,你在语句中直接写就可以了)
    declare @oldid varchar(10)
    declare @newid varchar(10)set @oldid = '0102'
    set @newid = '02'
    --更新Fid
    update table1 set Fid = @newid + substring(Fid,len(@oldid)+1,len(Fid) - len(@oldid))
    where left(Fid,len(@oldid)) = @oldid
    --更新ffid
    update table1 set ffid = @newid + substring(ffid,len(@oldid)+1,len(ffid) - len(@oldid))
    where left(ffid,len(@oldid)) = @oldid--这个语句同样适合于代码级别的更改,比如把0102改成02,这样他的级别就发生了变化,
    但是0102这条记录的ffid在语句里是不能更改的,需要你自己更改
      

  2.   

    例如:
    --同级变更
    declare @oldid varchar(10)
    declare @newid varchar(10)set @oldid = '01'
    set @newid = '02'
    --更新Fid
    update table1 set Fid = @newid + substring(Fid,len(@oldid)+1,len(Fid) - len(@oldid))
    where left(Fid,len(@oldid)) = @oldid
    --更新ffid
    update table1 set ffid = @newid + substring(ffid,len(@oldid)+1,len(ffid) - len(@oldid))
    where left(ffid,len(@oldid)) = @oldid--原数据:
    01 计算机耗材 00
    0101 打印机 01
    010101 墨盒 0101
    0102 复印机 01
    010201 碳粉 0102 --更改后的数据
    02 计算机耗材 00
    0201 打印机 02
    020101 墨盒 0201
    0202 复印机 02
    020201 碳粉 0202
    --异级变更
    declare @oldid varchar(10)
    declare @newid varchar(10)set @oldid = '0102'
    set @newid = '02'update table1 set Fid = @newid + substring(Fid,len(@oldid)+1,len(Fid) - len(@oldid))
    where left(Fid,len(@oldid)) = @oldidupdate table1 set ffid = @newid + substring(ffid,len(@oldid)+1,len(ffid) - len(@oldid))
    where left(ffid,len(@oldid)) = @oldid--原数据
    01 计算机耗材 00
    0101 打印机 01
    010101 墨盒 0101
    0102 复印机 01
    010201 碳粉 0102 --更新后的数据
    01 计算机耗材 00
    0101 打印机 01
    010101 墨盒 0101
    02 复印机 01
    0201 碳粉 02注意:这个时候02的上级应该不是01了,但是这个语句是更改不了的
      

  3.   


    Fid    type               ffid  idx
    01     计算机耗材         00
    0101   打印机             01
    010101 墨盒               0101
    0102   复印机             01
    010201 碳粉               0102
    ----------------------------------------------
    update TableName
    set Fid=replace(left(Fid,2),'01','02')+isnull(right(Fid,len(Fid)-2),'')
    ,ffid=replace(left(Fid,2),'01','02')+isnull(right(Fid,len(Fid)-2),'')