使用nodes()方法进行XML碎化

时间:2018-04-26 13:51:49

标签: sql-server xml tsql xpath xquery

由于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

1 个答案:

答案 0 :(得分:3)

尝试这样

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会有很大帮助:

您可以看到<NAME>低于<customer>

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

当您的.nodes()降至<customer>时,这是您的当前节点。属性@id直接位于那里。 text()中的<NAME>将从那里继续......