首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

这个只用SQL能实现吗,该如何解决

2012-04-13 
这个只用SQL能实现吗现在表一如下年级班数起始班班号初一32高二文31,3,4高二理22,5要生成如下表二:年级班

这个只用SQL能实现吗
现在表一如下

年级班数起始班班号
初一32
高二文31,3,4
高二理22,5

要生成如下表二:

年级班
初一2
初一3
初一4
高二文1
高二文3
高二文4
高二理2
高二理5

以前我一般在VB里截取一条一条添加的,能编个存储过程实现吗,利用参数进行传递,这样减少对数据库的访问


[解决办法]

SQL code
if object_id('[tb]') is not null drop table [tb]gocreate table [tb]([年级] varchar(6),[班数] int,[起始班] int,[班号] varchar(7))insert [tb]select '初一',3,2,null union allselect '高二文',3,null,'1,3,4' union allselect '高二理',2,null,'2,5'create proc sp_testasselect 年级,班=b.number from [tb] a join master..spt_values b on b.type='P' and b.number between 起始班 and 起始班+班数-1 and 班号 is nullunion allselect 年级,substring(a.班号,b.number,charindex(',',a.班号+',',b.number)-b.number) from tb a join master..spt_values bon b.type='P' and charindex(',',','+a.班号,b.number)=b.numberwhere 起始班 is nullgoexec sp_test/*年级     班------ -----------初一     2初一     3初一     4高二文    1高二文    3高二文    4高二理    2高二理    5(8 行受影响)*/
[解决办法]
SQL code
if object_id('[tb]') is not null drop table [tb]gocreate table [tb]([年级] varchar(6),[班数] int,[起始班] int,[班号] varchar(7))insert [tb]select '初一',3,2,null union allselect '高二文',3,null,'1,3,4' union allselect '高二理',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*/
[解决办法]
SQL code
--> 测试数据: @Tdeclare @T table (年级 varchar(6),班数 int,起始班 int,班号 varchar(10))insert into @Tselect '初一',3,2,null union allselect '高二文',3,null,'1,3,4' union allselect '高二理',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 allselect 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*/ 

热点排行