【问题标题】:How do you get a node that contains a child node with a given attribute value in an XML document using sql server?如何使用 sql server 在 XML 文档中获取包含具有给定属性值的子节点的节点?
【发布时间】:2013-07-26 22:01:53
【问题描述】:

我正在使用 SQL Server 2008 解析 XML 文档。我是一个完全的菜鸟,我想知道是否可以从你们那里得到帮助。

我有一个像下面这样的 XML 文档,我想获取“代码”节点具有 val=5 的“节”节点。

<root>
  <section>
    <code val=6 />
    ...
  </section>
  <section>
    <code val=5 />
    ...
  </section>
  <section>
    <code val=4 />
    ...
  </section>
</root>

所以结果应该是: <section> <code val=5 /> ... </section>

我试过这样做,但没有成功:

select @xml.query('/root/section') where @xml.value('/root/section/code/@val,'int')= '5'

我也试过这个: select @xml.query('/root/section') where @xml.exist('/root[1]/section[1]/code[@val="1"])= '1'

有什么想法吗?提前致谢。

【问题讨论】:

    标签: sql-server xml xpath xquery


    【解决方案1】:

    你可以使用这个查询:

    DECLARE @x XML=N'
    <root>
      <section atr="A">
        <code val="5" />
      </section>
      <section atr="B">
        <code val="6" />
      </section>
      <section atr="C">
        <code val="5" />
      </section>
    </root>';
    
    SELECT  a.b.query('.') AS SectionAsXmlElement,
            a.b.value('@atr','NVARCHAR(50)') AS SectionAtr
    FROM    @x.nodes('/root/section[code/@val="5"]') a(b);
    

    结果:

    SectionAsXmlElement                         SectionAtr
    ------------------------------------------- ----------
    <section atr="A"><code val="5" /></section> A
    <section atr="C"><code val="5" /></section> C
    

    【讨论】:

    • 这行得通!我知道这里不允许“谢谢”,但我必须表达我的感激之情。谢谢!
    • @Andy1:很高兴能帮上忙。
    【解决方案2】:

    您可以在 XPath 谓词中应用约束,而不是 where

    @xml.query('/root/section[code/@val=5]') 
    

    【讨论】:

    • 这似乎只给了我:“”有没有办法得到“
      ...
      ”?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多