如何从 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)。作为第二个参数,您需要指定值应该转换为什么类型 - 只是在这里猜测。

马克

【讨论】:

我在字段中有动态节点,例如 通过使用您的给定查询,我能够根据索引阅读。意味着当我将索引设为 1 时,它将显示 2,当我将索引设为 2 时,它将显示 5,但我需要两个节点。所以你能建议我怎么做吗! 我在将它用于布尔值时遇到了麻烦。我尝试使用 'boolean' 和 'System.Boolean' 作为第二个参数并收到错误。如果我做 varchar 它返回所有空值。我的 xml 行看起来像: @Zeb:SQL Server 没有 boolean 类型 - 它有 BIT - 或者您可能只需要将其读取为 INT 然后进一步处理它 如果,我们不确定 xml 中属性的路径。但确定xml标签。?意味着我有 xml 列,但每个 xml 都不同,我确信我的 xml 包含 标签,那么我们如何获取它的值..?

以上是关于如何从 SQL Server 中的 XML 元素获取特定属性的主要内容,如果未能解决你的问题,请参考以下文章

在SQL Server中使用value()从xml列获取多个记录

从sql server中的xml中提取数据

以特定格式从XML数据创建SQL Server表

如何从XML *向SQL Server DATE字段*中插入NULL

SQL XML - 从 SQL Server 为发票创建一个 XML 文件,包括一个 XML 文件中的发票位置

从 SQL Server 中的 XML 中删除所有空节点