如何从 SQL Server 中的 XML 元素获取特定属性
Posted
技术标签:
【中文标题】如何从 SQL Server 中的 XML 元素获取特定属性【英文标题】:How to get a particular attribute from XML element in SQL Server 【发布时间】:2010-12-06 09:00:28 【问题描述】:我在表格的一列中有类似以下 XML 的内容:
<?xml version="1.0" encoding="utf-8"?>
<container>
<param name="paramA" value="valueA" />
<param name="paramB" value="valueB" />
...
</container>
我正在尝试通过 TSQL 从 XML 中获取 valueB 部分
到目前为止,我得到了正确的节点,但现在我不知道如何获取属性。
select xmlCol.query('/container/param[@name="paramB"]') from LogTable
我想我可以在末尾添加 /@value,但是 SQL 告诉我属性必须是节点的一部分。我可以找到很多选择子节点属性的示例,但没有关于兄弟属性的任何示例(如果这是正确的术语)。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:根据您的 xml 的实际结构,在它上面放置一个视图可能会很有用,以便使用“常规”sql 更容易使用,例如
CREATE VIEW vwLogTable
AS
SELECT
c.p.value('@name', 'varchar(10)') name,
c.p.value('@value', 'varchar(10)') value
FROM
LogTable
CROSS APPLY x.nodes('/container/param') c(p)
GO
-- now you can get all values for paramB as...
SELECT value FROM vwLogTable WHERE name = 'paramB'
【讨论】:
为什么 xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)') 对我不起作用,而只是.value('@value', 'vharchar(50)') 有效吗?嗯嗯。【参考方案2】:尝试使用.value
函数而不是.query
:
SELECT
xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)')
FROM
LogTable
XPath 表达式可能会返回一个节点列表,因此您需要将[1]
添加到该潜在列表中,以告诉 SQL Server 使用这些条目中的第一个(是的 - 该列表是从 1 开始的 - 不是基于 0)。作为第二个参数,您需要指定值应该转换为什么类型 - 只是在这里猜测。
马克
【讨论】:
我在字段中有动态节点,例如boolean
类型 - 它有 BIT
- 或者您可能只需要将其读取为 INT
然后进一步处理它
如果,我们不确定 xml 中属性的路径。但确定xml标签。?意味着我有 xml 列,但每个 xml 都不同,我确信我的 xml 包含 标签,那么我们如何获取它的值..?以上是关于如何从 SQL Server 中的 XML 元素获取特定属性的主要内容,如果未能解决你的问题,请参考以下文章
在SQL Server中使用value()从xml列获取多个记录
如何从XML *向SQL Server DATE字段*中插入NULL