在SQL中从XML提取文本值

时间:2019-05-29 16:21:03

标签: sql xml ssms

我正在使用由第三方托管的SQL数据,并试图提取一些特定的信息以进行报告。但是,我需要解析的是XML格式,这让我陷入了困境。我正在寻找仅从XML代码中提取text =值的语法。

我相信代码应该是这样的,但是我在网上可以找到的大多数示例都涉及比我正在处理的更简单的XML层次结构。

<[columnnameXML].value('(/RelatedValueListBO/Items/RelatedValueListBOItem/text())[1]','varchar(max)')>

无法获取任何结果。我也曾尝试声明过空间名,但同样……我只以空值结尾。

我正在处理的XML示例:

<RelatedValueListBO xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                    xmlns="http://tempuri.org/RelatedValueListBOSchema.xsd">
    <Items>
        <RelatedValueListBOItem groupKey="Response1" text="Response1" selected="true" />
        <RelatedValueListBOItem groupKey="Response2" text="Response2" selected="true" />
        <RelatedValueListBOItem groupKey="Response3" text="Response3" selected="true" />
    </Items>
</RelatedValueListBO>

理想情况下,我想回复response1; response2; response3放入单个列中。考虑到可能存在多个响应的事实。我相信,由于与RelatedValueListBO相关联的命名空间以及我想要的东西分组在groupKey,text和selected中,而不是我想要的值仅停留在项目节点。

2 个答案:

答案 0 :(得分:0)

您可以使用类似的方法在RelatedValueListBOItem的第一个节点中提取“文本”的值

SELECT  extractvalue(value(rs), '//RelatedValueListBOItem[1]/@text')
  FROM TABLE (xmlsequence(extract(sys.xmltype('<RelatedValueListBO>
      <Items>
        <RelatedValueListBOItem groupKey="Response1" text="Response1" 
    selected="true" />
    <RelatedValueListBOItem groupKey="Response2" text="Response2" 
    selected="true" />
    <RelatedValueListBOItem groupKey="Response3" text="Response3" 
    selected="true" />
     </Items>
    </RelatedValueListBO>'),'/RelatedValueListBO/Items'))) rs;

答案 1 :(得分:0)

您已经在XML中定义了名称空间,因此您也需要在XQuery中对其进行定义。
快速而肮脏的方法是用“ *”替换所有名称空间:

SELECT @x.value('(/*:RelatedValueListBO/*:Items/*:RelatedValueListBOItem/@text)[1]','varchar(max)')

要在一个列中获得所有响应,可以使用:


SELECT 
 Item.Col.value('./@text','varchar(max)') X
FROM @x.nodes('/*:RelatedValueListBO/*:Items/*:RelatedValueListBOItem') AS Item(Col)

如果需要更好的性能,则可能需要正确定义名称空间。