我在表的列中有类似下面的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告诉我属性必须是节点的一部分。我可以找到许多用于选择子节点属性的示例,但兄弟属性中没有任何内容(如果这是正确的术语)。
任何帮助都将不胜感激。
答案 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'