【问题标题】:XML shredding using nodes() method使用 nodes() 方法进行 XML 粉碎
【发布时间】:2018-04-26 13:51:48
【问题描述】:

由于 xml 中节点的级别不同,我无法在 sql server 中粉碎此 xml。如何在单个查询中实现这一点。

我的 XML 格式如下:

<abc>
<item>
<Customer id="12345" age="26">
<NAME>Alex</NAME>
</customer>
</item>
</abc>

我尝试了以下提供客户 ID 的查询,但除此之外我还想要名称列。

SELECT doc.col.value('@id','INT')
FROM @xml.nodes('/abc/item/customer') doc(col) 

当前输出:

CustomerID
----------
12345

期望的输出:

CustomerID   Name
----------   -------
  12345      Alex

【问题讨论】:

    标签: sql-server xml tsql xpath xquery


    【解决方案1】:

    这样试试

    DECLARE @xml XML=
    N'<abc>
    <item>
    <customer id="12345" age="26">
    <NAME>Alex</NAME>
    </customer>
    </item>
    </abc>';
    
    SELECT doc.col.value('@id','INT') AS ID
          ,doc.col.value('(NAME/text())[1]','nvarchar(max)') AS Name
    FROM @xml.nodes('/abc/item/customer') doc(col);
    

    一些解释:

    • XML 严格区分大小写。你混合了Customercustomer...

    • 查看带有正确缩进的 XML 很有帮助:

    可以看到&lt;NAME&gt;&lt;customer&gt;下方

    <abc>
      <item>
        <customer id="12345" age="26">
          <NAME>Alex</NAME>
        </customer>
      </item>
    </abc>
    

    当您的.nodes() 下降到&lt;customer&gt; 时,这是您的当前节点。属性@id 直接坐在那里。 text() 中的 &lt;NAME&gt; 将从那里继续......

    【讨论】:

      猜你喜欢
      • 2012-01-22
      • 2011-09-12
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多