2010-06-24 70 views
7

假设我有一个SQL Server 2005的表,用含有如下值的XML列:SQL Server的XML列存在()的查询

CREATE TABLE XmlTest (
    XMLid int, 
    Data xml) 

INSERT XMLTest 
VALUES (1 , '<data><item><type v="1" /><value v="12.56" /></item><item><type  v="3" /><value v="DEBIT" /></item></data>') 

INSERT XMLTest 
VALUES (2 , '<data><item><type v="1" /><value v="99.22" /></item><item><type v="3" /><value v="CREDIT" /></item></data>') 

INSERT XMLTest 
VALUES (3 , '<data><item><type v="3" /><value v="12.56" /></item><item><type v="1" /><value v="DEBIT" /></item></data>') 

我想测试项目元素与V型是否存在等= “3”和值v =“DEBIT”。

我使用的是存在()函数如下:

SELECT * 
FROM XmlTest 
WHERE Data.exist('/data/item/type[@v=''3'']') = 1 
AND Data.exist('/data/item/value[@v=''DEBIT'']') = 1 

然而,这使我回行与XMLid 1和3

任何人都可以说明我需要什么样的变化,使我在哪里子句只返回具有类型节点v值为3且值节点v值为“DEBIT”的项目的记录?即,仅在XMLid 1

记录

感谢

回答

7

试试这个:

SELECT * 
FROM XmlTest 
WHERE Data.exist('/data/item[type[@v=''3''] and value[@v=''DEBIT'']]') = 1 
+1

+1 DARN!我经过一番研究后才想出了这个解决方案....只是为了找到你已经快了6分钟了..... ARGH! :-)但是,好的通话! – 2010-06-24 11:07:30

+1

完美。感谢Matt&Marc_s的帮助。 – doshea 2010-06-24 12:04:40