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

My *_* Me 35 xml sql-server xpath xquery

我在表的列中有类似下面的XML:

<?xml version="1.0" encoding="utf-8"?>
<container>
  <param name="paramA" value="valueA" />
  <param name="paramB" value="valueB" />
  ...
</container>
Run Code Online (Sandbox Code Playgroud)

我试图通过TSQL从XML中获取valueB部分

到目前为止,我正在获得正确的节点,但现在我无法弄清楚如何获取属性.

select xmlCol.query('/container/param[@name="paramB"]') from LogTable
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,将不胜感激.

mar*_*c_s 60

尝试使用该.value功能而不是.query:

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

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


小智 7

根据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'
Run Code Online (Sandbox Code Playgroud)