--2005的create table tb(箱号 varchar(10),订单编号 varchar(10),品名 varchar(10),数量 int,单位 varchar(10))
insert tb select  '1-5'   ,   'F01'  ,  '上衣'   , 10 ,   'PCS' 
insert tb select  '6-6'   ,   'F02'  ,  '裤子'   ,  2 ,    'PCS' 
;
with tmpCTE as
(
   select convert(int,left(箱号,1)) ln,
          convert(int,right(箱号,1)) cnt,
          订单编号,品名,数量,单位
   from tb
   union all
   select ln+1,cnt,订单编号,品名,数量,单位
   from tmpCTE
   where ln+1<=cnt
)
select ln 箱号,订单编号,品名,数量,单位 from tmpCTE order by lndrop table tb/*
create table tb(箱号 varchar(10),订单编号 varchar(10),品名 varchar(10),数量 int,单位 varchar(10))
insert tb select  '1-5'   ,   'F01'  ,  '上衣'   , 10 ,   'PCS' 
insert tb select  '6-6'   ,   'F02'  ,  '裤子'   ,  2 ,    'PCS' 
;
with tmpCTE as
(
   select convert(int,left(箱号,1)) ln,
          convert(int,right(箱号,1)) cnt,
          订单编号,品名,数量,单位
   from tb
   union all
   select ln+1,cnt,订单编号,品名,数量,单位
   from tmpCTE
   where ln+1<=cnt
)
select ln 箱号,订单编号,品名,数量,单位 from tmpCTE order by lndrop table tb
*/

解决方案 »

  1.   

    贴错了..create table tb(箱号 varchar(10),订单编号 varchar(10),品名 varchar(10),数量 int,单位 varchar(10))
    insert tb select  '1-5'   ,   'F01'  ,  '上衣'   , 10 ,   'PCS' 
    insert tb select  '6-6'   ,   'F02'  ,  '裤子'   ,  2 ,    'PCS' 
    ;
    with tmpCTE as
    (
       select convert(int,left(箱号,1)) ln,
              convert(int,right(箱号,1)) cnt,
              订单编号,品名,数量,单位
       from tb
       union all
       select ln+1,cnt,订单编号,品名,数量,单位
       from tmpCTE
       where ln+1<=cnt
    )
    select ln 箱号,订单编号,品名,数量,单位 from tmpCTE order by lndrop table tb/*
    箱号          订单编号       品名         数量          单位
    ----------- ---------- ---------- ----------- ----------
    1           F01        上衣         10          PCS
    2           F01        上衣         10          PCS
    3           F01        上衣         10          PCS
    4           F01        上衣         10          PCS
    5           F01        上衣         10          PCS
    6           F02        裤子         2           PCS(6 行受影响)*/
      

  2.   

    create table tb(箱号 varchar(10),   订单编号 varchar(10), 品名 varchar(10),   数量  int ,单位 varchar(10)  )
    insert into tb select '1-5'      ,'F01',    '上衣',    10,    'PCS' 
    insert into tb select '6-6'      ,'F02',    '裤子',     2,     'PCS'
    -- 用个临时表
    select top 100 id=identity(int,1,1) into # from sysobjects a,sysobjects bselect b.id as 箱号 ,订单编号,  品名 ,  数量 ,  单位     from tb a,# b
    where b.id between left(箱号,charindex('-',箱号)-1) and substring(箱号,charindex('-',箱号)+1,len(箱号)) /*
    箱号          订单编号       品名         数量          单位
    ----------- ---------- ---------- ----------- ----------
    1           F01        上衣         10          PCS
    2           F01        上衣         10          PCS
    3           F01        上衣         10          PCS
    4           F01        上衣         10          PCS
    5           F01        上衣         10          PCS
    6           F02        裤子         2           PCS(6 行受影响)
    */
      

  3.   

    2005的..改改..create table tb(箱号 varchar(10),订单编号 varchar(10),品名 varchar(10),数量 int,单位 varchar(10))
    insert tb select  '1-5'   ,   'F01'  ,  '上衣'   , 10 ,   'PCS' 
    insert tb select  '6-6'   ,   'F02'  ,  '裤子'   ,  2 ,    'PCS' 
    ;
    with tmpCTE as
    (
       select convert(int,left(箱号,charindex('-',箱号)-1)) ln,
              convert(int,substring(箱号,charindex('-',箱号)+1,10)) cnt,
              订单编号,品名,数量,单位
       from tb
       union all
       select ln+1,cnt,订单编号,品名,数量,单位
       from tmpCTE
       where ln+1<=cnt
    )
    select ln 箱号,订单编号,品名,数量,单位 from tmpCTE order by lndrop table tb
    /*
    箱号          订单编号       品名         数量          单位
    ----------- ---------- ---------- ----------- ----------
    1           F01        上衣         10          PCS
    2           F01        上衣         10          PCS
    3           F01        上衣         10          PCS
    4           F01        上衣         10          PCS
    5           F01        上衣         10          PCS
    6           F02        裤子         2           PCS(6 行受影响)
    */
      

  4.   

    create table tb(箱号 varchar(10),订单编号 varchar(10),品名 varchar(10),数量 int,单位 varchar(10))
    insert into tb select '1-5','F01','上衣',10,'PCS'
    insert into tb select '6-6','F02','裤子',2,'PCS'select top 100 id=identity(int,1,1) into # from sysobjects a,sysobjects bselect a.id,b.订单编号,b.品名,b.数量,b.单位 from # a ,(select left(箱号,1) as id1,right(箱号,1) as id2,订单编号,品名,数量,单位 from tb)b
    where a.id between b.id1 and b.id2
    id 订单编号 品名 数量 单位
    1 F01 上衣 10 PCS
    2 F01 上衣 10 PCS
    3 F01 上衣 10 PCS
    4 F01 上衣 10 PCS
    5 F01 上衣 10 PCS
    6 F02 裤子 2 PCS
      

  5.   

    我的数据库是2000的,
    liangCK 的方法运行出错
      

  6.   


    --写个特别点的,
    create table os(箱号 varchar(10),订单编号 varchar(10),品名 varchar(10),数量 int,单位 varchar(10))
    insert into os select '1-5','F01','上衣','10','PCS'
    insert into os select '6-6','F02','裤子','2','PCS'
    alter function f_os(@箱号 varchar(10))
    returns @t table(id int)
    as
    begin
    declare @star int,@end int
    set @star=cast(left(@箱号,charindex('-',@箱号)-1) as int)
    set @end=cast(right(@箱号,len(@箱号)-charindex('-',@箱号)) as int)
    while(@star<=@end)
    begin
    insert into @t select @star
    set @star=@star+1
    end
    return
    enddeclare @sql varchar(8000)
    select @sql=isnull(@sql+' union all ','')+'select * from dbo.f_os('''+箱号+''')' from os
    exec('select a.id,b.订单编号,b.品名,b.数量,b.单位 from ('+@sql+')a left join os b
    on a.id between cast(left(箱号,charindex(''-'',箱号)-1) as int) and  cast(right(箱号,len(箱号)-charindex(''-'',箱号)) as int)')
      

  7.   

    楼上不具通用性……
    convert(int,left(箱号,1))如果有2位呢?
      

  8.   

    create table tb(箱号 varchar(10), 订单编号 varchar(10), 品名 varchar(10), 数量 int, 单位 varchar(10))
    insert into tb values('1-5', 'F01', '上衣', 10, 'PCS') 
    insert into tb values('6-6', 'F02', '裤子', 2, 'PCS') 
    goselect top 8000 identity(int,0,1) as id into tmp from syscolumns a,syscolumns bselect 箱号 = cast(left(箱号,charindex('-',箱号) -1) as int) + n.id , 订单编号 , 品名 , 数量 , 单位
    from tb m , tmp n 
    where cast(left(箱号,charindex('-',箱号) -1) as int) + n.id <= cast(substring(箱号,charindex('-',箱号) +1 , len(箱号)) as int)
    order by 箱号drop table tb,tmp/*
    箱号          订单编号       品名         数量          单位         
    ----------- ---------- ---------- ----------- ---------- 
    1           F01        上衣         10          PCS
    2           F01        上衣         10          PCS
    3           F01        上衣         10          PCS
    4           F01        上衣         10          PCS
    5           F01        上衣         10          PCS
    6           F02        裤子         2           PCS(所影响的行数为 6 行)
    */
      

  9.   

    drop table #t
    create table #t (箱号 varchar(10),订单编号 varchar(10),品名  varchar(10), 数量  int, 单位 varchar(10) )
    insert into #t
    select '1-5',     'F01',    '上衣',   10,    'PCS' 
    union
    select '6-6',      'F02',    '裤子',     2,     'SOS'
    union
    select '7-10',      'F03',    '裤子',     5,     'PCS'
    union
    select '11-101',      'F04',    '上衣',     50,     'SOS'
    ;
    with t as 
    (
    select convert(int,left(箱号,charindex('-',箱号)-1)) BeginNum,
           convert(int,substring(箱号,charindex('-',箱号)+1,10)) EndNum,
           订单编号,
           品名,
           数量,
           单位
    from #t
    union all
    select BeginNum+1,EndNum,订单编号,品名,数量,单位
    from t
    where BeginNum<Endnum
    )select * from t order by BeginNum/*1 5 F01 上衣 10 PCS
    2 5 F01 上衣 10 PCS
    3 5 F01 上衣 10 PCS
    4 5 F01 上衣 10 PCS
    5 5 F01 上衣 10 PCS
    6 6 F02 裤子 2 SOS
    7 10 F03 裤子 5 PCS
    8 10 F03 裤子 5 PCS
    9 10 F03 裤子 5 PCS
    10 10 F03 裤子 5 PCS
    11 101 F04 上衣 50 SOS
    12 101 F04 上衣 50 SOS
    13 101 F04 上衣 50 SOS
    14 101 F04 上衣 50 SOS
    15 101 F04 上衣 50 SOS
    16 101 F04 上衣 50 SOS
    17 101 F04 上衣 50 SOS
    18 101 F04 上衣 50 SOS
    19 101 F04 上衣 50 SOS
    20 101 F04 上衣 50 SOS
    21 101 F04 上衣 50 SOS
    22 101 F04 上衣 50 SOS
    23 101 F04 上衣 50 SOS
    24 101 F04 上衣 50 SOS
    25 101 F04 上衣 50 SOS
    26 101 F04 上衣 50 SOS
    27 101 F04 上衣 50 SOS
    28 101 F04 上衣 50 SOS
    29 101 F04 上衣 50 SOS
    30 101 F04 上衣 50 SOS
    31 101 F04 上衣 50 SOS
    32 101 F04 上衣 50 SOS
    33 101 F04 上衣 50 SOS
    34 101 F04 上衣 50 SOS
    35 101 F04 上衣 50 SOS
    36 101 F04 上衣 50 SOS
    37 101 F04 上衣 50 SOS
    38 101 F04 上衣 50 SOS
    39 101 F04 上衣 50 SOS
    40 101 F04 上衣 50 SOS
    41 101 F04 上衣 50 SOS
    42 101 F04 上衣 50 SOS
    43 101 F04 上衣 50 SOS
    44 101 F04 上衣 50 SOS
    45 101 F04 上衣 50 SOS
    46 101 F04 上衣 50 SOS
    47 101 F04 上衣 50 SOS
    48 101 F04 上衣 50 SOS
    49 101 F04 上衣 50 SOS
    50 101 F04 上衣 50 SOS
    51 101 F04 上衣 50 SOS
    52 101 F04 上衣 50 SOS
    53 101 F04 上衣 50 SOS
    54 101 F04 上衣 50 SOS
    55 101 F04 上衣 50 SOS
    56 101 F04 上衣 50 SOS
    57 101 F04 上衣 50 SOS
    58 101 F04 上衣 50 SOS
    59 101 F04 上衣 50 SOS
    60 101 F04 上衣 50 SOS
    61 101 F04 上衣 50 SOS
    62 101 F04 上衣 50 SOS
    63 101 F04 上衣 50 SOS
    64 101 F04 上衣 50 SOS
    65 101 F04 上衣 50 SOS
    66 101 F04 上衣 50 SOS
    67 101 F04 上衣 50 SOS
    68 101 F04 上衣 50 SOS
    69 101 F04 上衣 50 SOS
    70 101 F04 上衣 50 SOS
    71 101 F04 上衣 50 SOS
    72 101 F04 上衣 50 SOS
    73 101 F04 上衣 50 SOS
    74 101 F04 上衣 50 SOS
    75 101 F04 上衣 50 SOS
    76 101 F04 上衣 50 SOS
    77 101 F04 上衣 50 SOS
    78 101 F04 上衣 50 SOS
    79 101 F04 上衣 50 SOS
    80 101 F04 上衣 50 SOS
    81 101 F04 上衣 50 SOS
    82 101 F04 上衣 50 SOS
    83 101 F04 上衣 50 SOS
    84 101 F04 上衣 50 SOS
    85 101 F04 上衣 50 SOS
    86 101 F04 上衣 50 SOS
    87 101 F04 上衣 50 SOS
    88 101 F04 上衣 50 SOS
    89 101 F04 上衣 50 SOS
    90 101 F04 上衣 50 SOS
    91 101 F04 上衣 50 SOS
    92 101 F04 上衣 50 SOS
    93 101 F04 上衣 50 SOS
    94 101 F04 上衣 50 SOS
    95 101 F04 上衣 50 SOS
    96 101 F04 上衣 50 SOS
    97 101 F04 上衣 50 SOS
    98 101 F04 上衣 50 SOS
    99 101 F04 上衣 50 SOS
    100 101 F04 上衣 50 SOS
    101 101 F04 上衣 50 SOS*/
      

  10.   

    学习~create table tb(箱号 varchar(10),订单编号 varchar(10),品名 varchar(10),数量 int,单位 varchar(10))
    insert tb select  '1-5'   ,   'F01'  ,  '上衣'   , 10 ,   'PCS' 
    insert tb select  '6-6'   ,   'F02'  ,  '裤子'   ,  2 ,    'PCS' select top 100 id=identity(int,1,1) into # from sysobjects,syscolumns select ltrim(b.id) as 箱号,a.订单编号 ,a.品名 ,a.数量,a.单位 from tb  a
    inner join # b 
    on b.id>=left(a.箱号,charindex('-', a.箱号)-1) and b.id <=right(a.箱号,len( a.箱号)-charindex('-', a.箱号)) /*
    箱号  订单编号   品名   数量     单位  
    ----------------------------------------
    1 F01 上衣 10 PCS
    2 F01 上衣 10 PCS
    3 F01 上衣 10 PCS
    4 F01 上衣 10 PCS
    5 F01 上衣 10 PCS
    6 F02 裤子 2 PCS
    */
    drop table tb,#