我有一个包含大型XML文档的列的大表。我想获取特定属性名称(Surname)的所有值,发生在任何XML值的任何位置。
目前我有这个查询...
select distinct XmlCol.value('(//@Surname)[1]','varchar(200)') from (
select * from MyTable
)
...它在XML列的每个条目中抓取我想要的属性的第一次出现,但是因为它只抓取第一个,所以在该出现之后可能会出现任意数量的属性,在相同的XML值中。 / p>
value()函数仅适用于单个结果,因此我需要提供[1]指定返回第一个匹配。
有没有办法重复这个函数来获取一段XML中的所有命中,还是有另一个函数需要一个XPath并且可以返回多个值?
插图示例
如果上面的情况不明确,一个简单的例子就是如果MyTable有一个XmlCol列,只有2行。
第1行
<SimpleXML>
<ArbitraryElement Surname="Smith"/>
<ArbitraryElement>
<ArbitraryInnerElement Surname="Bauer"/>
</ArbitraryElement>
</SimpleXML>
第2行
<SimpleXML Surname="Bond">
</SimpleXML>
请注意,该属性出现在不同的位置和不同的元素中,我希望它可以与任意数量的嵌套元素一起使用。
目前我的方法只针对每个XML条目命中第一个元素,因此给出输出:
Smith, Bond
我希望每个条目返回一个任意数量,这意味着结果应该是:
Smith, Bauer, Bond
答案 0 :(得分:2)
您可能希望使用CROSS APPLY
来实现此目的。
select distinct XmlCol.value('.', 'varchar(max)') as [Value]
from MyTable
CROSS APPLY MyTable.XmlCol.nodes('(//@Surname)') as [Table]([Column])