--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
*/
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
*/
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 行受影响)*/
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 行受影响)
*/
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 行受影响)
*/
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
liangCK 的方法运行出错
--写个特别点的,
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)')
convert(int,left(箱号,1))如果有2位呢?
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 行)
*/
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*/
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,#