SQL进阶提升(xml合并拆分详细实例)

      今天在网上看到一个关于sql的疑难问题是这样的:

一个数据表里有一个varchar字段

varchar类型的一个字段包含这样的数据33,444,5555
要求把33加89,444加899,5555加8999
其实就是两位数字,三位数字,四位数字中间用逗号隔开这种格式
但是可能会没有第三位,或者第第二,第三位数都没有,只有第一位数。

创建临时表插入数据:

 

代码
1 create table #T
2 (
3 id int identity(1,1) primary key,
4 data nvarchar(20)
5 )
6
7  insert into #T
8  values('33,444,5555')
9
10  declare @count int
11  set @count=1
12  while(@count<1000)
13  begin
14  insert into #T
15  values('12,123')
16  insert into #T
17  values('33,444,5555')
18  insert into #T
19  values('11')
20 set @count=@count+1
21 end
22 select * from #T

现在用sql2005 xml拆分聚合来进行update,当然可以用简单的sql update比如:

 

代码
1 update #T set data=(
2 case when len(data)=2 then cast(left(data,2)+89 as varchar)
3 when len(data)=6 then cast(left(data,2)+89 as varchar)+','+cast(substring(data,4,3)+899 as varchar)
4 when len(data)=11 then cast(left(data,2)+89 as varchar)+','+cast(substring(data,4,3)+899 as varchar)+','+cast(substring(data,8,4)+8999 as varchar)
5 else data
6 end
7 )
8
9 select * from #T

 

xml 来update

拆分:

 

代码
1 --拆分
2 SELECT A.id, B.data,len(B.data) as len into #TT
3 FROM(
4 SELECT id, [data] = CONVERT(xml,'<root><v>' + REPLACE([data], ',', '</v><v>') + '</v></root>') FROM #T
5 )A
6 OUTER APPLY(
7 SELECT data = N.v.value('.', 'varchar(100)') FROM A.[data].nodes('/root/v') N(v)
8 )B

 

 

更新:

 

1 select * from #TT
2 --更新
3 update #TT set data=data+(
4 case when len=2 then 899
5 when len=3 then 5555
6 when len=4 then 8999
7 else 0
8 end
9 )

合并:

 

代码
1 update #T set data=
2 (select top 1 data
3 from
4 (
5 select A.id,b.data
6 from
7 (select distinct id from #TT)as a
8 outer apply
9 (
10 select stuff(replace(replace((select data from #TT where id=a.id for xml auto),'<_x0023_TT data="',','),'"/>',''),1,1,'')
11 as data
12 )as b
13 )C
14 where C.id=#T.id)
15
16 select * from #T
17
18 drop table #TT
19 drop table #T

解释:replace((select data from #TT where id=a.id for xml auto),'<_x0023_TT data="',',')

在select data from #TT,(select distinct id from #TT)as a where #TT.id=a.id for xml auto
我们可以看到sql查询的结果如下,那么通过替代把xml属于性标签替代成,号,最后的stuff是去掉第一个逗号。

点开查询结果是一个xml文档

 

 

 

 

这里主要演示怎么进行聚合和拆分,如果是大量数据不介意这么用, 这主要应用在查询方面。

posted on 2010-02-27 11:29  MR_ke  阅读(3785)  评论(2编辑  收藏  举报

导航