2009-11-13 3 views
10

Sto avendo una tabella con una colonna XML. Mi piacerebbe filtrare le righe in cui un attributo specifico nell'XML corrisponde a una stringa, essenzialmente facendo un WHERE o HAVING.Filtra query SQL nella colonna XML utilizzando XPath/XQuery

La tabella simile a questa

| id | xml | 

E il qualcosa di simile a XML

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

voglio ottenere tutti gli ID in cui l'attributo @name abbinato un valore.

sono stato in grado di effettuare le seguenti operazioni:

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

Ma è incredibilmente lento.

Ci deve essere un modo migliore per filtrare l'output della query.

+0

Se non l'hai già fatto, Vorrei anche suggerire facendo indici in modo di avere sulle vostre colonne XML. > [Panoramica degli indici XML (SQLServerPedia.com)] (http://sqlserverpedia.com/wiki/XML_Indexes_Overview) – Kev

risposta

20

Trovato. Invece di usare query(), dovrei usare exist().

La mia domanda sarebbe quindi

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