39

我在表的列中有类似以下 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 告诉我属性必须是节点的一部分。我可以找到很多选择子节点属性的示例,但没有关于兄弟属性的任何示例(如果这是正确的术语)。

任何帮助,将不胜感激。

4

2 回答 2

73

尝试使用该.value函数而不是.query

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

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

马克

于 2009-10-13T15:47:50.127 回答
10

根据您的 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'
于 2009-10-13T22:39:01.393 回答