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)
| 归档时间: |
|
| 查看次数: |
78914 次 |
| 最近记录: |