日期:2014-05-18 浏览次数:20581 次
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([年级] varchar(6),[班数] int,[起始班] int,[班号] varchar(7))
insert [tb]
select '初一',3,2,null union all
select '高二文',3,null,'1,3,4' union all
select '高二理',2,null,'2,5'
create proc sp_test
as
select 年级,班=b.number from [tb] a
join master..spt_values b on b.type='P'
and b.number between 起始班 and 起始班+班数-1 and 班号 is null
union all
select 年级,substring(a.班号,b.number,charindex(',',a.班号+',',b.number)-b.number)
from tb a join master..spt_values b
on b.type='P' and charindex(',',','+a.班号,b.number)=b.number
where 起始班 is null
go
exec sp_test
/*
年级 班
------ -----------
初一 2
初一 3
初一 4
高二文 1
高二文 3
高二文 4
高二理 2
高二理 5
(8 行受影响)
*/
------解决方案--------------------
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([年级] varchar(6),[班数] int,[起始班] int,[班号] varchar(7))
insert [tb]
select '初一',3,2,null union all
select '高二文',3,null,'1,3,4' union all
select '高二理',2,null,'2,5'
select a.年级,case when a.起始班+b.number IS not null then a.起始班+b.number else
(select ap.v1 from (select CAST('<root><v>'+replace(班号,',','</v><v>')+'</v></root>' as xml) as vv from (select a.班号) as ttb )tt outer apply(
select rn=ROW_NUMBER() over(order by getdate()),N.v.value('.','varchar(10)') v1 from tt.vv.nodes('/root/v') N(v)) ap where ap.rn=b.number+1 )
end
from tb a join master..spt_values b on a.班数> b.number
where b.type='p'
--这个复杂了。
/*
年级
------ -----------
初一 2
初一 3
初一 4
高二文 1
高二文 3
高二文 4
高二理 2
高二理 5
*/
------解决方案--------------------
--> 测试数据: @T
declare @T table (年级 varchar(6),班数 int,起始班 int,班号 varchar(10))
insert into @T
select '初一',3,2,null union all
select '高二文',3,null,'1,3,4' union all
select '高二理',2,null,'2,5'
select a.年级,b.number from @T a join master..spt_values b
on b.number between a.起始班 and 起始班+ 班数-1 and b.type='p'
union all
select A.年级, B.班号 from(
select 年级, 班号 = convert(xml,' <root> <v>' + replace(班号, ',', ' </v> <v>') + ' </v> </root>') from @T
where 班号 is not null)A
outer apply(select 班号 = N.v.value('.', 'varchar(100)') from A.班号.nodes('/root/v') N(v) )B
/*
年级 number
------ -----------
初一 2
初一 3
初一 4
高二文 1
高二文 3
高二文 4
高二理 2
高二理 5
*/