如何从SQL Server中的XML元素获取特定属性

时间:2009-10-13 15:44:41

标签: sql-server xml xpath xquery

我在表的列中有类似下面的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

我想我可以在最后添加/ @值,但是SQL告诉我属性必须是节点的一部分。我可以找到许多用于选择子节点属性的示例,但兄弟属性中没有任何内容(如果这是正确的术语)。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:56)

尝试使用.value功能代替.query

SELECT 
  xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)') 
FROM  
  LogTable

XPath表达式可能会返回节点列表,因此您需要向该潜在列表添加[1]以告知SQL Server使用这些条目中的第一个(是的 - 该列表是基于1的 - 不是基于0)。作为第二个参数,您需要指定值应转换为的类型 - 只需在此猜测。

马克

答案 1 :(得分:6)

根据xml的实际结构,在它上面添加一个视图以使用'regular'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'