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.
InformationsquelleAutor phloopy | 2008-09-18
Schreibe einen Kommentar