我正在使用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()
答案 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))。
请参阅以下链接了解更多信息: