用于返回多个XPath命中的SQL函数

时间:2017-06-08 13:31:05

标签: sql sql-server

我有一个包含大型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

1 个答案:

答案 0 :(得分:2)

您可能希望使用CROSS APPLY来实现此目的。

select distinct XmlCol.value('.', 'varchar(max)') as [Value]
from MyTable
CROSS APPLY MyTable.XmlCol.nodes('(//@Surname)') as [Table]([Column])