我将以下XML存储在SQL Server 2012表的xml列中。
<Values>
<V ID="MyValue1" Value="True" />
<V ID="MyValue2" Value="False" />
</Values>
我正在尝试从ID为“ MyValue1”的节点获取Value
作为XML的布尔值。经过一番搜索和一些SQL xml错误,我最终得到了这个结果:
SELECT ID, [Values],
[Values].value('data(/Values/V[@ID="MyValue1"]/@Value)[1]', 'bit') AS MyBool
FROM [MyXmlValues]
这似乎有点疯狂。是否没有更简单的方法(例如,没有数据部分)通过XPath查询单个值?
StackOverflow上的大多数问题和示例都使用[1]来指示该节点,但是我不确定我的节点是XML所期望的第一个节点。
答案 0 :(得分:1)
您不需要data()
。您可以使用
(/Values/V[@ID="MyValue2"]/@Value)[1]'
如果您希望更多的节点具有要搜索的ID,并希望它们具有第一个属性值(即,具有该属性的第一个节点中的属性值,或者
(/Values/V[@ID="MyValue2"])[1]/@Value'
如果要选择具有ID的第一个节点并获取其属性值,而不论是否设置了该值。
如果只有一个节点可以拥有该ID,这似乎是合理的,则没有区别。