2010-02-23 73 views
3

我有以下XML存储在SQL Server 2008数据库的XML字段中。XPath检查是否存在所有提供的元素对

<attributes> 
    <attribute> 
    <key>animal</key> 
    <value>rat</value> 
    </attribute> 
    <attribute> 
    <key>color</key> 
    <value>black</value> 
    </attribute> 
</attributes> 

我能够选择所有从表中具有与SQL中的以下XPath“老鼠”的值的“动物”键的条目。

SELECT * 
FROM XmlEvents 
WHERE Attributes.exist('/attributes/attribute[key="animal" and value="rat"]') = 1 

如何检查具有多个属性的匹配? (Key = Animal & Value = Rat)AND(Key = Color & Value = Black)我试图找到以下行:(Key = Animal & Value = Rat)AND(Key = Color & Value = Black)。

(是的,我可以把另一个.exist用在我的WHERE子句,但我试图避免)

奖励积分,如果你能引导我正确的方向,使一些这方面的 - 什么是动态的。我很想拥有一个存储过程或函数,它可以以某种方式获取键/值对列表并找到与提供的所有内容相匹配的所有行。

+0

为什么你想避免第二'和EXISTS'?你认为这会带来更好的表现吗? – Aaronaught 2010-02-23 04:56:44

+0

我想比较所有的可能性。你认为AND EXISTS会比Markusk提供的xpath更好吗? – Vyrotek 2010-02-23 05:35:03

+0

+1问题是我能发现SQL Server中存在“.exist()= 1”语法的唯一文档。 – 2012-12-17 22:48:44

回答

3

XPath允许嵌套谓词和多个谓词。你可以写

/attributes[attribute[key="animal" and value="rat"]][attribute[key="color" and value="black"]] 

或等价的,但有所缩短

/attributes[attribute[key="animal"]/value="rat" and attribute[key="color"]/value="black"] 
+0

哦,没错!非常感谢! – Vyrotek 2010-02-23 05:33:04