Mithilfe von SQL Server 2005 und XQuery-wählen Sie alle Knoten mit einem bestimmten Attribut-Wert, oder mit diesem Attribut fehlt
Update: was eine viel gründlichere Beispiel.
Den beiden ersten Lösungen angeboten wurden entlang der Linien von dem, was ich zu sagen versuchte nicht zu tun. Ich kann nicht wissen, location, es muss in der Lage sein zu betrachten um das gesamte Dokument-Baum. So eine Lösung entlang dieser Linien, die mit /Bücher/als der angegebene Kontext wird nicht funktionieren:
SELECT x.query('.') FROM @xml.nodes('/Books/*[not(@ID) or @ID = 5]') x1(x)
Ursprüngliche Frage mit besserem Beispiel:
Mithilfe von SQL Server 2005 in der XQuery-Implementierung, die ich brauchen, um wählen Sie alle Knoten in einem XML-Dokument nur einmal jede und behalten Ihre ursprüngliche Struktur, aber nur, wenn Sie vermissen ein bestimmtes Attribut oder das Attribut einen bestimmten Wert (übergebene parameter). Die Abfrage muss auch Arbeit auf das gesamte XML-Dokument (descendant-or-self-Achse) eher als die Auswahl auf einer vorgegebenen Tiefe.
Ist zu sagen, jeder einzelne Knoten erscheint in dem resultierenden Dokument nur, wenn er und alle seine Vorfahren sind, fehlt das Attribut oder die Attribut mit einem bestimmten Wert.
Zum Beispiel:
Wenn dies das XML:
DECLARE @Xml XML
SET @Xml =
N'
<Library>
<Novels>
<Novel category="1">Novel1</Novel>
<Novel category="2">Novel2</Novel>
<Novel>Novel3</Novel>
<Novel category="4">Novel4</Novel>
</Novels>
<Encyclopedias>
<Encyclopedia>
<Volume>A-F</Volume>
<Volume category="2">G-L</Volume>
<Volume category="3">M-S</Volume>
<Volume category="4">T-Z</Volume>
</Encyclopedia>
</Encyclopedias>
<Dictionaries category="1">
<Dictionary>Webster</Dictionary>
<Dictionary>Oxford</Dictionary>
</Dictionaries>
</Library>
'
Parameter 1 für Kategorie würde zu diesem Ergebnis führen:
<Library>
<Novels>
<Novel category="1">Novel1</Novel>
<Novel>Novel3</Novel>
</Novels>
<Encyclopedias>
<Encyclopedia>
<Volume>A-F</Volume>
</Encyclopedia>
</Encyclopedias>
<Dictionaries category="1">
<Dictionary>Webster</Dictionary>
<Dictionary>Oxford</Dictionary>
</Dictionaries>
</Library>
Parameter 2 für Kategorie würde zu diesem Ergebnis führen:
<Library>
<Novels>
<Novel category="2">Novel2</Novel>
<Novel>Novel3</Novel>
</Novels>
<Encyclopedias>
<Encyclopedia>
<Volume>A-F</Volume>
<Volume category="2">G-L</Volume>
</Encyclopedia>
</Encyclopedias>
</Library>
Ich weiß XSLT ist perfekt geeignet für diesen job, aber es ist nicht eine option. Wir haben, um dies zu erreichen, die vollständig in SQL Server 2005. Alle Implementierungen nicht mit XQuery sind auch in Ordnung, so lange, wie es getan werden kann, vollständig in T-SQL.
- Wahrscheinlich wäre es am besten, wenn Sie gab ein Beispiel dafür, warum dies nicht funktioniert.
- Bitte siehe meine aktualisierte Antwort. Ich bin gespannt, ob das hilft oder nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht klar für mich aus deinem Beispiel, was du eigentlich zu erreichen versuchen. Wollen Sie, um wieder eine neue XML-Datei mit allen Knoten befreit, ausgenommen diejenigen, die die Bedingung erfüllen? Wenn ja, dann ist das der job für eine XSLT-Transformation, die ich glaube nicht, dass es gebaut-in in MSSQL 2005 (können Hinzugefügt werden, wie eine UDF-Datei: http://www.topxml.com/rbnews/SQLXML/re-23872_Performing-XSLT-Transforms-on-XML-Data-Stored-in-SQL-Server-2005.aspx).
Wenn Sie nur brauchen, um wieder die Liste der Knoten dann können Sie diesen Ausdruck:
aber ich habe den Eindruck, dass es nicht das, was Sie brauchen. Würde es helfen, wenn Sie können wir ein klareres Beispiel.
Bearbeiten: Dieses Beispiel ist in der Tat mehr klar. Das beste, was ich finden konnte ist diese:
Die Idee ist, löschen aus der XML alle Knoten, dass Sie nicht brauchen, so dass Sie bleiben mit der ursprünglichen Struktur und der benötigten Knoten. Getestet habe ich mit Ihr zwei Beispiele, und es produziert das erwartete Ergebnis.
Jedoch ändern hat einige Einschränkungen - es scheint, Sie können es nicht verwenden in einer select-Anweisung, es zu ändern von Daten in Stelle. Wenn Sie brauchen, um wieder solche Daten mit einer select-könnte man eine temporäre Tabelle in die Kopie der original-Daten und aktualisieren Sie dann die Tabelle. So etwas wie dieses:
Hoffe, das hilft.
Die Frage ist nicht wirklich klar, aber ist es das, was du suchst?