2010-02-23 93 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