这个查询如何将csv拆分成sql server中的行?

时间:2014-10-14 05:56:27

标签: sql-server

我正在使用sql-server 2012

这是查询

drop table #t
create table #t(id int,name varchar(10))
insert into #t values(1,'a,b,c'),(2,'d,e')

select A.id,split.a.value('.','varchar(10)') as string 
from 
    (select id,cast('<M>'+replace([name],',','</M><M>')+'</M>' as xml) as string from #t) as A  cross apply string.nodes('/M') as split(a)

我正在尝试使用此处使用的查询逻辑,但无法理解它是如何工作的?

某人可以指导我理解

cast()子句和split.a.value()

中的逻辑

1 个答案:

答案 0 :(得分:2)

Cast子句将字符串转换为XML片段,稍后由“节点”消耗。方法。如果只运行子查询:

select id,cast('<M>'+replace([name],',','</M><M>')+'</M>' as xml) as string 
from #t

您会得到以下结果:

id  string
1   <M>a</M><M>b</M><M>c</M>
2   <M>d</M><M>e</M>

Node方法将XML数据拆分为关系形式。为了过度简化,节点方法为您提供了一个表格&#39; Split&#39;用一列&#39; A&#39;。 Value方法最终将节点中的值转换为varchar以进行投影: (split.A.value(&#39;。&#39;,&#39; varchar(10)&#39;)可以解释为Table.Column.Value(root to varchar(10))。

请参阅以下链接了解更多信息:

节点方法:http://msdn.microsoft.com/en-us/library/ms188282.aspx

价值方法:http://msdn.microsoft.com/en-us/library/ms178030.aspx