急求一个SQL过程的编写
需要将一个表转成另一个表,由1条记录转成多条记录,很不好做,请大家帮助,谢谢!A表:(申请表)
申请编号    人员名称 (注:人员中的分隔符为操作员手工录入,可能为,、;等各种可能的符号)
00001       张三,李四、王五
......B表:(人员参数表)
人员编号       名称
01             张三
02             李四现在要根据上面的2个表,求出:C表:(输出表)
申请编号    人员编号    人员名称
00001         01          张三
00001         02          李四
00001        王五                    (由于在人员参数表中找不到对应的名称,就将名称直接写在人员编号中)

解决方案 »

  1.   

    如果没有同名或者相似名的,分隔符的问题可以用charindex来解决,关键是有些名字在B表没有
      

  2.   

    写个规范的 就当练手 if OBJECT_ID('a') is not null
    drop table a 
    go
    create table a (申请编号 varchar(10) , 人员名称 varchar(100))
    insert a select 
    '00001' ,'张三,李四,王五'
    go 
    if OBJECT_ID('b') is not null
    drop table b
    go
    create table b (人员编号 varchar(10) , 名称 varchar(10))
    insert b select
    '01',            '张三' union select  
    '02',            '李四' 
    go
    select 申请编号,
    人员编号=ISNULL(人员编号,name),
    人员名称=ISNULL(人员编号,'')
    from (
    select 申请编号,
    SUBSTRING(a.人员名称,number,CHARINDEX(',',a.人员名称+',',number)-number) as name
    from a join master..spt_values s 
    on  s.number between 1 and LEN(a.人员名称)
    where type='p' and SUBSTRING(','+a.人员名称,number,1)=',') k left join b on k.name=b.名称
    /*
    申请编号       人员编号       人员名称
    ---------- ---------- ----------
    00001      01         01
    00001      02         02
    00001      王五         */
      

  3.   


    还写错了。。
    select 申请编号,
    人员编号=ISNULL(人员编号,name),
    人员名称=case when 人员编号 IS null then '' else name end
    from (
    select 申请编号,
    SUBSTRING(a.人员名称,number,CHARINDEX(',',a.人员名称+',',number)-number) as name
    from a join master..spt_values s 
    on  s.number between 1 and LEN(a.人员名称)
    where type='p' and SUBSTRING(','+a.人员名称,number,1)=',') k left join b on k.name=b.名称
      

  4.   

    feixianxxx高手啊!
    但是,由于字符串并没有明确的分隔符,甚至根本就没有分隔符,所以,还是不能达到功能要求。
    这种不规范的写法确实很难拆分,我能想到的只有使用逐个字符串组合分别与人员表进行比较,先比较长字符,再比较短字符,找到了,就执行insert,最后没有找到的剩余字符,就插入到最后。