由于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
答案 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严格区分大小写。您已混合Customer
和customer
...
使用正确的缩进查看XML会有很大帮助:
您可以看到<NAME>
低于<customer>
<abc>
<item>
<customer id="12345" age="26">
<NAME>Alex</NAME>
</customer>
</item>
</abc>
当您的.nodes()
降至<customer>
时,这是您的当前节点。属性@id
直接位于那里。 text()
中的<NAME>
将从那里继续......