您的位置:首页 > 其它

将包含分号的字段值拆分成多条记录

2010-05-04 20:47 204 查看
将包含分号的字段值拆分成多条记录

xx,yy,zz三个字段中的内容如果分号分隔的个数相同(以xx字段为基准),则按先后顺序拆分记录,如果分号分隔的个数与xx字段不同的,则按xx字段的分隔的个数拆分记录,与其个数不等的原样不变

drop table #aa
go
create table #aa(xx varchar(200),yy varchar(200),zz varchar(200))
insert #aa
select '1;2;3','好;中;差','山东;北京;上海'
union all
select '4;5','好;中','广东;河南;安徽'
union all
select '6;7;8','中;差','江西;河北;湖南'
union all
select '9','差','湖北'
union all
select '10;11','好;差','福建;青海'
go

--> 显示原数据
select * from #aa
/*原数据

xx yy zz
-------------------------------------------
1;2;3 好;中;差 山东;北京;上海
4;5 好;中 广东;河南;安徽
6;7;8 中;差 江西;河北;湖南
9 差 湖北
10;11 好;差 福建;青海

(5 行受影响)
*/

--> 代码实现
declare @temp table(xx int,yy varchar(20),zz varchar(20)) --> 创建临时表来存储结果
declare @xx varchar(20),@yy varchar(20),@zz varchar(20),@x varchar(20),@y varchar(20),@z varchar(20)
declare my_cursor cursor for select * from #aa --> 声明游标
open my_cursor
fetch next from my_cursor into @xx,@yy,@zz
while @@fetch_status=0
begin
declare @a varchar(20),@b varchar(20),@c varchar(20)
select @a=@xx,@b=@yy,@c=@zz
while(len(@xx)>0)
begin
if charindex(';',@xx)>0
begin
if len(@a)-len(replace(@a,';',''))<>len(@b)-len(replace(@b,';',''))
select @x=left(@xx,(charindex(';',@xx)-1)),@y=@yy
else
select @x=left(@xx,charindex(';',@xx)-1),@y=left(@yy,charindex(';',@yy)-1),@yy=stuff(@yy,1,charindex(';',@yy),'')
if len(@a)-len(replace(@a,';',''))<>len(@c)-len(replace(@c,';',''))
select @x=left(@xx,charindex(';',@xx)-1),@z=@zz
else
select @x=left(@xx,charindex(';',@xx)-1),@z=left(@zz,charindex(';',@zz)-1),@zz=stuff(@zz,1,charindex(';',@zz),'')
insert into @temp select @x,@y,@z
set @xx=stuff(@xx,1,charindex(';',@xx),'')
end
else
begin
insert into @temp select @xx,@yy,@zz
set @xx=''
end
end
fetch next from my_cursor into @xx,@yy,@zz
end
deallocate my_cursor

--> 显示结果数据
select * from @temp

/*结果数据

xx yy zz
-------------------------------
1 好 山东
2 中 北京
3 差 上海
4 好 广东;河南;安徽
5 中 广东;河南;安徽
6 中;差 江西
7 中;差 河北
8 中;差 湖南
9 差 湖北
10 好 福建
11 差 青海

(11 行受影响)
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: