![](/img/trans.png)
[英]How to get value from XML attribute using Sql:Variable in xquery
[英]How do I pull the value of an attribute from XML using XQUERY?
CREATE TABLE SportsEvent
(ID INT, Name NVARCHAR(20), Results XML);
GO
DECLARE @Results XML=
'<Athletics>
<Event ID="001" Name="100m">
<Gold>John Doe</Gold>
<Silver>Harry Smith</Silver>
<Bronze>Kenneth Brown</Bronze>
</Event>
<Event ID="002" Name="High Jump">
<Gold>Sarah Jones</Gold>
<Silver>Janice Johnson</Silver>
<Bronze>Alicia Armstrong</Bronze>
</Event>
</Athletics>'
INSERT INTO SportsEvent
VALUES(1, 'AthleticsDay', @Results);
SELECT * FROM SportsEvent;
如果我想根据事件ID提取元素,则没问题:
SELECT Results.query('(/Athletics/Event[@ID="001"]/Gold)')
FROM SportsEvent
WHERE ID = 1
我可以使用相对参考进行相同的操作:
SELECT Results.query('(Athletics/Event)[1]')
FROM SportsEvent
WHERE ID = 1
但是,如果我想基于相对或绝对来提取事件名称怎么办?:
SELECT Results.query('(Athletics/Event[@Name])[@ID="001"]')
FROM SportsEvent
WHERE ID = 1
SELECT Results.query('(Athletics/Event[@Name])[1]')
FROM SportsEvent
WHERE ID = 1
...两者都带回该事件的所有数据。
我尝试使用值方法:
SELECT Results.value('(/Athletics/Event/@Name)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1
...但是这仅适用于相对参考,即在这种情况下是XML中的第一组结果。
如果我想指定事件ID并仅返回事件名称(作为XML片段或作为数据/值)怎么办?
好的,所以对于某些人(很多?)来说,这似乎令人眼花obvious乱,但是我会贴上我的礼物,以防它阻止其他人花费令人沮丧的几个小时来回绕转(我刚刚做过)。
SELECT Results.value('(/Athletics/Event[@ID="001"]/@Name)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1
SELECT Results.value('(/Athletics/Event[@Name="100m"]/@ID)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1
SELECT Results.value('(/Athletics/Event[@Name="High Jump"]/@ID)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1
SELECT Results.value('(/Athletics/Event[@ID="002"]/@Name)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1
据我所知,您不能使用查询方法仅返回属性的值,查询必须使用不允许在元素外部的属性来编写。
但是,您可以按以下方式使用查询方法-路径末尾的'[1]'(单个)不是必需的(它们与value方法一起使用)。 您将获得包含指定属性的整个片段。
SELECT Results.query('(/Athletics/Event[@ID="002"][@Name])[1]')
FROM SportsEvent
WHERE ID = 1
SELECT Results.query('(/Athletics/Event[@Name="100m"][@Name])[1]')
FROM SportsEvent
WHERE ID = 1
希望这对某人有帮助。
欢迎任何评论,更正或增加。 谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.