如何在sql中查询xml列
Posted
技术标签:
【中文标题】如何在sql中查询xml列【英文标题】:How to query xml column in tsql 【发布时间】:2012-10-23 03:40:10 【问题描述】:我有一个表 T1,在 SQL Server 2008 上有一个 XML 列 EventXML。我想查询某个节点包含特定值的所有行。更好的是,我想检索不同节点中的值。表T1:
T1:
EventID, int
EventTime, datetime
EventXML, XML
这是一个示例 XML 层次结构:
<Event>
<Indicator>
<Name>GDP</Name>
</Indicator>
<Announcement>
<Value>2.0</Value>
<Date>2012-01-01</Date>
</Announcement>
</Event>
-
如何查找与“GDP”指标相关的所有行;
如何获取“GDP”指标的所有值;
【问题讨论】:
【参考方案1】:这个怎么样?
SELECT
EventID, EventTime,
AnnouncementValue = t1.EventXML.value('(/Event/Announcement/Value)[1]', 'decimal(10,2)'),
AnnouncementDate = t1.EventXML.value('(/Event/Announcement/Date)[1]', 'date')
FROM
dbo.T1
WHERE
t1.EventXML.exist('/Event/Indicator/Name[text() = "GDP"]') = 1
它将找到/Event/Indicator/Name
等于GDP
的所有行,然后它将显示这些行的<Announcement>/<Value>
和<Announcement>/<Date>
。
见SQLFiddle demo
【讨论】:
因为其他所有解决方案都使用了 declare 语句,我很困惑如何内联。【参考方案2】:DECLARE @t XML = '
<Event>
<Indicator>
<Name>GDP</Name>
</Indicator>
<Announcement>
<Value>2.0</Value>
<Date>2012-01-01</Date>
</Announcement>
</Event>
<Event>
<Indicator>
<Name>Other</Name>
</Indicator>
<Announcement>
<Value>3.0</Value>
<Date>2012-01-01</Date>
</Announcement>
</Event>
'
SELECT node.value('.', 'NUMERIC(20, 2)')
FROM @t.nodes('/Event[Indicator/Name/node()=''GDP'']/Announcement/Value') t(node)
【讨论】:
以上是关于如何在sql中查询xml列的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 中使用 value() 从 xml 列获取多条记录