使用sql server时标记具有相同名称的XML数据检索

时间:2017-03-24 10:12:39

标签: sql sql-server xml xpath xquery-sql

对于以下XML:

<property name="jboss.as.jpa.providerModule" value="org.hibernate:5.2.4.Final" />

如何使用Sql server查询根据Attribute中的条目检索Value标记的内容。 如果属性是assets,则值应为5000.

1 个答案:

答案 0 :(得分:0)

尝试这样

DECLARE @xml XML=
N'<SheetData>
  <Finance>
    <value>1000</value>
    <Currency>USD</Currency>
    <Attribute>Sales</Attribute>
  </Finance>
  <Finance>
    <value>5000</value>
    <Currency>USD</Currency>
    <Attribute>Assets</Attribute>
  </Finance>
</SheetData>';

DECLARE @attr VARCHAR(100)='Assets';

SELECT @xml.value('(/SheetData/Finance[Attribute=sql:variable("@attr")]/value/text())[1]','int') 

您阅读XPath如下:

SheetData开始,向下导航至Finance。搜索节点,其中<Attribute>与给定变量类似,并从那里读取value的文本。

更新

您的第二个示例(在评论中)再添加一个嵌套级别Component

declare @xml xml=
'<SheetData>
  <Finance>
    <value>1000</value>
    <GeoCurr>
      <Currency>USD</Currency>
    </GeoCurr>
    <Component>
      <Attribute>Sales</Attribute>
    </Component>
  </Finance>
  <Finance>
    <value>5000</value>
    <GeoCurr>
      <Currency>USD</Currency>
    </GeoCurr>
    <Component>
      <Attribute>Assets</Attribute>
    </Component>
  </Finance>
</SheetData>';

DECLARE @attr VARCHAR(100)='Assets';

SELECT @xml.value('(/SheetData/Finance[Component/Attribute=sql:variable("@attr")]/value/text())[1]','int')