2009-10-13 87 views
30

我有类似如下XML在表中的列:如何从XML元素在SQL Server中的特定属性

<?xml version="1.0" encoding="utf-8"?> 
<container> 
    <param name="paramA" value="valueA" /> 
    <param name="paramB" value="valueB" /> 
    ... 
</container> 

我试图通过TSQL获得VALUEB部分出了XML的

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

select xmlCol.query('/container/param[@name="paramB"]') from LogTable 

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

任何帮助,将不胜感激。

回答

51

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

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

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

马克

+1

谢谢。正是我需要的。 – 2009-10-13 16:12:49

+0

我在该领域的动态节点像 通过使用您给予的查询我能够根据索引读取。意思当我给索引作为1时,它将显示2,当我给索引2时,它将显示5,但我需要两个节点。所以你会建议我怎么做! – pixelbyaj 2013-09-13 07:34:03

+0

我有麻烦使用这个布尔值。我尝试使用'布尔'和'System.Boolean'作为第二个参数,并收到错误。如果我做varchar它会返回所有空值。我的xml行如下所示: Zac 2015-01-06 16:32:54

5

根据您的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' 
+0

为什么xmlCol.value('(/ container/param [@ name =“paramB”]/@ value)[1]','varchar(50)')对我无效,只是.value('@ value' ,'vharchar(50)')确实有效? Hmmmmm。 – AndyClaw 2013-08-28 18:58:01

0

$doc/param[@value = "valueB"]/fn:data(@value)
假设$ doc有Xml。

相关问题