在 SQL Server 中使用 value() 从 xml 列获取多条记录
Posted
技术标签:
【中文标题】在 SQL Server 中使用 value() 从 xml 列获取多条记录【英文标题】:Getting multiple records from xml column with value() in SQL Server 【发布时间】:2010-11-26 11:13:03 【问题描述】:此 SQL 仅返回第一个 Activity 元素。我如何选择它们?如果我删除查询中的 [1],我会收到“value() 需要单例”的错误。
DECLARE @myDoc xml
SET @myDoc =
'<Root>
<Activities>
<Activity>This is activity one</Activity>
<Activity>This is activity two</Activity>
<Activity>This is activity three</Activity>
</Activities>
</Root>'
SELECT @myDoc.value('(/Root/Activities/Activity)[1]', 'varchar(100)' )
【问题讨论】:
【参考方案1】:感谢 Ed,但我找到了一个更简单的版本:
SELECT T.C.value('.', 'varchar(100)') as activity
FROM @myDoc.nodes('(/Root/Activities/Activity)') as T(C)
尽管从您的“不必要的复杂”示例来看,它看起来简单得令人担忧..
【讨论】:
如果 XML 标签出现多次,我想选择它出现的次数怎么办? ***.com/questions/26426412/… 什么是T,什么是C T 是由节点函数创建的派生表的别名。该节点函数返回一段 xml,其中包括所有 Activity 节点名称 + 值(如果有的话,也会返回任何子节点和值)。 C 是列别名,在这种情况下,它将 xml 分解为该列每一行上的“活动”节点。【参考方案2】:这可行,但似乎不必要地复杂。可能有更简单的方法。
DECLARE @myDoc xml
SET @myDoc =
'<Root>
<Activities>
<Activity>This is activity one</Activity>
<Activity>This is activity two</Activity>
<Activity>This is activity three</Activity>
</Activities>
</Root>'
SELECT activity.VALUE('(//Activity)[1]','varchar(100)') AS activity
FROM (
SELECT NewTable.activity.query('.') AS activity
FROM (SELECT 1 AS col1) AS t
CROSS APPLY @myDoc.nodes('(/Root/Activities/Activity)') AS NewTable(activity)
) AS x
【讨论】:
【参考方案3】:这是另一种情况和解决方案:我正在搜索这种情况,其中使用一个查询要选择两个元素。
CREATE TABLE #Table1 (ID INT IDENTITY(1,1),XMLDoc XML)
INSERT INTO #Table1 VALUES ('
<bookstore>
<name>Bookstore1</name>
<location>Location1</location>
<book>
<title>Titile1</title>
<price>40</price>
</book>
</bookstore>')
INSERT INTO #Table1 VALUES ('
<bookstore>
<name>Bookstore2</name>
<location>Location2</location>
<book>
<title>Titile2</title>
<price>50</price>
</book>
</bookstore>')
SELECT ID,
T.c.value('title[1]','varchar(50)') AS 'BookTitile',
T.c.value('price[1]','decimal(18,2)') AS 'Price'
FROM #Table1
CROSS APPLY #Table1.XMLDoc.nodes('/bookstore/book') T(c)
DROP TABLE #Table1
您可以根据需要对其进行修改以包含 XMLNamespaces。 解决方案最初发现于:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/35e75e32-9ffb-4a30-8637-2cc928554763/selecting-multiple-values-from-multiple-rows-of-xml?forum=sqlxml
【讨论】:
以上是关于在 SQL Server 中使用 value() 从 xml 列获取多条记录的主要内容,如果未能解决你的问题,请参考以下文章
C#Dapper使用JSON_VALUE进行SQL Server 2016
GROUP BY 中的 SQL Server 2014 LAST_VALUE