Frage Filtern Sie SQL-Abfragen in der XML-Spalte mithilfe von XPath / XQuery


Ich habe eine Tabelle mit einer XML-Spalte. Ich möchte die Zeilen herausfiltern, in denen ein spezifisches Attribut in der XML einer Zeichenkette entspricht, im Wesentlichen ein WHERE oder HAVING.

Der Tisch sieht ungefähr so ​​aus

| id | xml |

Und das XML etwas ähnliches

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

Ich möchte alle IDs erhalten, bei denen das Attribut @name einem Wert entspricht.

Ich konnte Folgendes tun:

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

Aber es ist unglaublich langsam.

Es muss eine bessere Möglichkeit geben, die Ausgabe der Abfrage zu filtern.


10
2017-11-13 15:33


Ursprung


Antworten:


Fand es. Anstelle von query () sollte ich verwenden existieren().

Meine Abfrage wäre dann

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

20
2017-11-13 15:59