2009-11-13 20 views
10

Estoy teniendo una tabla con una columna XML. Me gustaría filtrar las filas donde un atributo específico en el XML coincide con una cadena, esencialmente haciendo un WHERE o HAVING.Filtrar consultas SQL en la columna XML usando XPath/XQuery

La mesa se ve algo como esto

| id | xml | 

Y el XML algo similar a

<xml> 
    <info name="Foo"> 
    <data .../> 
    </info> 
<xml> 

quiero conseguir todos los identificadores de los que el atributo @Name igualó su valor.

he sido capaz de hacer lo siguiente:

SELECT id, xml.query('data(/xml/info/@name)') as Value 
FROM Table1 
WHERE CAST(xml.query('data(/xml/info/@name)') as varchar(1024)) = @match 

Pero es increíblemente lento.

Debe haber una mejor manera de filtrar en el resultado de la consulta.

+0

Si no lo ha hecho, También me sugieren hacer índices de que usted tiene en sus columnas XML. > [Descripción general de índices XML (SQLServerPedia.com)] (http://sqlserverpedia.com/wiki/XML_Indexes_Overview) – Kev

Respuesta

20

Lo encontró. En lugar de usar query() debería usar exist().

Mi consulta sería entonces

SELECT id, xml.query('data(/xml/info/@name)') as Value 
FROM Table1 
WHERE xml.exist('/xml/info/[@name=sql:variable("@match")]') = 1 
Cuestiones relacionadas