【发布时间】:2013-12-11 07:25:11
【问题描述】:
使用 SQL Server 将 XML 解析为列的最简单方法是什么。示例:
<ns0:root xmlns:ns0="http://herp...">
<ns1:FirstElement xmlns:ns1="http://derpyderp...">
<ns1:FirstElementID>AAF11303</ns1:FirstElementID>
<ns1:FirstEValue>some random text</ns1:FirstEValue>
<ns1:SecondElement>
<ns1:Something>Asdsad</ns1:Something>
<ns1:Else>
<ns1:Stuff>sdf</ns1:Stuff>
<ns1:StuffVal>15</ns1:StuffVal>
</ns1:Else>
<ns1:Else>
<ns1:Stuff>jarjar</ns1:Stuff>
<ns1:StuffVal>16</ns1:StuffVal>
<ns1:StuffParam>true</ns1:StuffParam>
</ns1:Else>
</ns1:SecondElement>
<ns1:randValue>dosd</ns1:randValue>
</ns1:FirstElement>
<ns1:FirstElement>
<ns1:FirstElementID>DDF00301</ns1:FirstElementID>
<ns1:FirstEValue/>
<ns1:SecondElement>
<ns1:Else>
<ns1:Stuff>yessir</ns1:Stuff>
<ns1:StuffVal>0</ns1:StuffVal>
</ns1:Else>
</ns1:SecondElement>
</ns1:FirstElement>
<!-- ... times n the first element with a variating amount of children up to 15 levels deep -->
</ns0:root>
我希望这是一个简单的列输出,即:
FIRSTELEMENTID | FIRSTEVALUE | SOMETHING | ELSE.STUFF | ELSE.STUFFVAL | ELSE.STUFFPARAM | RANDVALUE
'AAF11303' |'some random text'| 'Asdasd' | 'sdf' | 15 | NULL | 'dosd'
'AAF11303' |'some random text'| 'Asdasd' | 'jarjar' | 16 | TRUE | 'dosd'
'DDF00301' | NULL | NULL | 'yessir' | 0 | NULL | NULL
现在,实际的 XML 要复杂得多,到目前为止,我看到的所有示例都涉及手动解析 XML,基本上将每个子元素作为自己的 XML 传递,并在脚本的下一个循环中单独解析,等等等等等等。
有什么方法可以像这样输出值吗?手动解析几 MB 的 XML,其中元素出现的次数、出现的次数和位置有无数种变化,这需要花费一天的时间。
我一直在考虑使用 C# 进行 CLR 程序集,并将结果作为表传递给 SQL,但我想知道是否还有其他方法。
谢谢!
【问题讨论】:
标签: sql sql-server xml xpath sqlxml