2010-06-24 11 views
7

Suponiendo que tengo una tabla de SQL Server 2005 con una columna XML que contiene los siguientes valores:SQL existe() consulta

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>') 

que quiero probar la existencia de elementos item con un tipo v = "3" Y un valor v = "DEBITO".

estoy usando la función existe() de la siguiente manera:

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

Sin embargo esto me lleva de nuevo filas con XMLid 1 y 3.

¿Alguien puede esbozar lo que el cambio Necesito hacer a mi DONDE cláusula para devolver solo el registro que tiene un ítem donde el valor del nodo de tipo v es 3 y el valor del valor del nodo v es "DEBIT"? es decir, solamente grabar con XMLid 1

Gracias

Respuesta

7

Prueba esto:

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

+1 MALDITO! Acabo de presentar esta solución después de un poco de investigación ... solo para descubrir que has sido 6 minutos más rápido ... ¡ARGH! :-) Buena llamada, sin embargo! –

+1

Perfecto. Gracias Matt & Marc_s por su ayuda. – doshea

Cuestiones relacionadas