Verwenden des EXPLIZITEN Modus mit FOR XML

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Wie im Artikel beschrieben, bieten das Erstellen von XML unter Verwendung von FOR XML, RAW und AUTO nicht viel Kontrolle über das Shape des XML-Codes, das aus einem Abfrageergebnis generiert wurde. Der EXPLICIT-Modus hingegen ermöglicht größte Flexibilität beim Generieren der gewünschten XML-Ausgabe aus einem Abfrageergebnis.

Die Abfrage im EXPLICIT-Modus muss so geschrieben werden, dass die zusätzlichen Informationen zu der erforderlichen XML-Ausgabe, wie z. B. die erwartete Schachtelung, explizit als Teil der Abfrage angegeben werden. Das Schreiben von Abfragen im EXPLICIT-Modus kann jedoch aufwendig sein, je nachdem, welche XML-Daten erforderlich sind. Möglicherweise ist das Verwenden des PATH-Modus mit Schachtelung dem Schreiben von Abfragen im EXPLICIT-Modus als einfachere Alternative vorzuziehen.

Da Sie die gewünschten XML-Daten als Teil der Abfrage im EXPLICIT-Modus beschreiben, müssen Sie sicherstellen, dass die generierten XML-Daten wohlgeformt und gültig sind.

Rowset-Verarbeitung im EXPLIZITEN Modus

Der EXPLICIT-Modus transformiert das Rowset, das beim Ausführen der Abfrage ausgegeben wird, in ein XML-Dokument. Das Rowset muss ein bestimmtes Format aufweisen, damit der EXPLICIT-Modus das XML-Dokument erstellt. Dies erfordert, dass Sie die zum Erstellen des Rowsets, universal table, erforderliche SELECT-Abfrage in einem bestimmten Format schreiben, damit die Verarbeitungslogik die gewünschten XML-Daten erstellt.

Zuerst muss die Abfrage die folgenden beiden Metadatenspalten erstellen:

  • Die erste Spalte muss die Tagnummer des aktuellen Elements als Integer-Typ bereitstellen; der Name der Spalte muss Taglauten. Die Abfrage muss eine eindeutige Tagnummer für jedes aus dem Rowset konstruierte Element bereitstellen.

  • Die zweite Spalte muss die Tagnummer des übergeordneten Elements bereitstellen; der Name dieser Spalte muss Parentlauten. So stellen die Tag- und die Parent-Spalte Informationen zur Hierarchie bereit.

Die Werte der Metadatenspalten sowie die Informationen in den Spaltennamen werden dann zum Erstellen der gewünschten XML-Ausgabe verwendet. Ihre Abfrage muss Spaltennamen auf eine bestimmte Weise bereitstellen. Beachten Sie außerdem, dass der Wert 0 oder NULL in der Parent -Spalte anzeigt, dass das entsprechende Element kein übergeordnetes Element besitzt. Das Element wird der XML-Ausgabe auf der obersten Ebene hinzugefügt.

Zum besseren Verständnis dazu, wie die von der Abfrage generierte Universaltabelle zu einem XML-Ergebnis verarbeitet wird, nehmen Sie einmal an, Sie haben eine Abfrage geschrieben, die die folgende Universaltabelle erstellt:

Sample universal table.

Beachten Sie hinsichtlich dieser Universaltabelle Folgendes:

  • Die ersten beiden Spalten sind Metadatenspalten mit der Bezeichnung Tag und Parent . Diese Werte bestimmen die Hierarchie.

  • Die Spaltennamen werden auf eine bestimmte Weise angegeben, wie weiter unten in diesem Artikel beschrieben.

  • Beim Generieren der XML-Ausgabe aus dieser Universaltabelle werden die Daten dieser Tabelle vertikal in Spaltengruppen partitioniert. Die Gruppierung wird aufgrund des Tag -Wertes und der Spaltennamen bestimmt. Beim Konstruieren der XML-Ausgabe wählt die Verarbeitungslogik jeweils eine Spaltengruppe für jede Zeile aus und konstruiert so ein Element. In diesem Beispiel gilt Folgendes:

    • Für den Wert „1“ in der ersten Zeile der Tag -Spalte bilden die Spalten, deren Namen dieselbe Tagnummer enthalten, also Customer!1!cid und Customer!1!name, eine Gruppe. Diese Spalten werden bei der Verarbeitung der Zeile verwendet, und Sie haben möglicherweise bemerkt, dass die Form des generierten Elements ist <Customer id=... name=...>. Das Spaltennamenformat wird weiter unten in diesem Artikel beschrieben.

    • Für Zeilen mit Tag-Spaltenwert 2 bilden "Order!2!id" und "Order!2!date" eine Gruppe, die dann beim Erstellen von Elementen verwendet wird. <Order id=... date=... />

    • Für die Zeilen mit dem Wert „3“ in der Tag -Spalte bilden die Spalten OrderDetail!3!id!id und OrderDetail!3!pid!idref ebenfalls eine Gruppe. Jede dieser Zeilen generiert ein Element aus <OrderDetail id=... pid=...>diesen Spalten.

  • Beim Generieren der XML-Hierarchie werden die Zeilen in der Reihenfolge verarbeitet. Die XML-Hierarchie wird wie folgt bestimmt:

    • Die erste Zeile gibt den Tag -Wert 1 und den Parent -Wert NULL an. Daher wird das entsprechende Element, <Customer> Element, als Element auf oberster Ebene im XML-Code hinzugefügt.

      <Customer cid="C1" name="Janine">
      
    • In der zweiten Zeile werden der Tag -Wert 2 und der Parent -Wert 1 aufgeführt. Daher wird das Element, <Order> Element, als untergeordnetes Element des <Customer> Elements hinzugefügt.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
      
    • In den nächsten beiden Zeilen werden der Tag -Wert 3 und der Parent -Wert 2 aufgeführt. Daher werden die beiden Elemente, <OrderDetail> Elemente, als untergeordnete Elemente des <Order> Elements hinzugefügt.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
      
    • Die letzte Zeile identifiziert die Tag -Nummer 2 und die Parent -Tagnummer 1. Daher wird dem <Customer> übergeordneten Element ein weiteres <Order> untergeordnetes Element hinzugefügt.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
         </Order>
         <Order id="O2" date="3/29/1997">
      </Customer>
      

Zusammenfassend sind also beim Verwenden des EXPLICIT-Modus zum Erstellen einer XML-Ausgabe die Werte in der Tag - und Parent -Metadatenspalte, die in den Spaltennamen bereitgestellten Informationen sowie die richtige Reihenfolge der Zeilen erforderlich.

Sortierung universeller Tabellenzeilen

Beim Konstruieren der XML-Daten werden die Zeilen in der Universaltabelle der Reihe nach verarbeitet. Daher müssen die Zeilen des Rowsets so angeordnet werden, dass jedem übergeordneten Knoten unmittelbar dessen untergeordnete Elemente folgen, damit die den einzelnen übergeordneten Elementen zugeordneten untergeordneten Elemente ordnungsgemäß abgerufen werden können.

Angeben von Spaltennamen in einer universellen Tabelle

Beim Schreiben von Abfragen im EXPLICIT-Modus müssen die Spaltennamen des resultierenden Rowsets im folgenden Format angegeben werden. Die Spaltennamen stellen Transformationsinformationen wie Element- und Attributnamen sowie weitere, in Direktiven angegebene, zusätzliche Informationen bereit.

Das allgemeine Format sieht folgendermaßen aus:

ElementName!TagNumber!AttributeName!Directive

Es folgt die Beschreibung der einzelnen Teile des Formats:

  • ElementName

    Der resultierende generische Bezeichner des Elements. Wenn beispielsweise Customers als ElementName angegeben ist, wird das <Customers>-Element generiert.

  • TagNumber

    Einem Element zugewiesener eindeutiger Tagwert. Dieser Wert bestimmt mithilfe der beiden Metadatenspalten Tag und Parentdie Schachtelung der Elemente in der XML-Ausgabe.

  • AttributeName

    Stellt den Namen des zu konstruierenden Attributs im angegebenen ElementName-Element bereit. Dies ist das Verhalten, wenn die Direktive nicht angegeben ist.

    Wenn einer der Werte xml , cdataoder elementfür Directiveangegeben wird, wird dieser Wert zum Konstruieren eines untergeordneten Elements von ElementNameverwendet, und der Wert der Spalte wird diesem hinzugefügt.

    Wenn Sie einen Wert für Directiveangeben, kann AttributeName leer sein. Beispiel: ElementName!TagNumber!!Directive. In diesem Fall ist der Spaltenwert direkt in ElementNameenthalten.

  • Directive

    Directive ist optional und wird zum Bereitstellen zusätzlicher Informationen für das Konstruieren der XML-Ausgabe verwendet. Directive hat zwei Aufgaben.

    • Die erste besteht darin, Werte als ID, IDREF und IDREFS zu codieren. Sie können die Schlüsselwörter ID, IDREFund IDREFS als Werte für Directiveangeben. Diese Direktiven überschreiben die Attributtypen. Außerdem ermöglichen sie, dokumentinterne Links zu erstellen.

    • Sie können Directive auch verwenden, um anzugeben, wie die Zeichenfolgendaten der XML-Ausgabe zugeordnet werden sollen. Als Werte für Directivekönnen die Schlüsselwörter hide, element, elementxsinil, xml, xmltext und cdataverwendet werden. Die hide -Direktive blendet den Knoten aus. Dies ist nützlich, wenn Sie Werte nur für Sortierzwecke abrufen, sie aber nicht im resultierenden XML-Code verwenden möchten.

    Die element -Direktive generiert ein enthaltenes Element anstelle eines Attributs. Die enthaltenen Daten sind als Entität codiert. So wird z. B. das Zeichen < zu <. Bei Spaltenwerten von NULL wird kein Element generiert. Wenn Sie möchten, dass für NULL-Spaltenwerte Elemente generiert werden, können Sie die elementxsinil -Direktive angeben. Damit wird ein Element mit dem Attribut xsi:nil=TRUE generiert.

    Die xml -Direktive ist mit der element -Direktive identisch, mit der Ausnahme, dass keine Entitätscodierung vorgenommen wird. Die Elementdirektive kann mit ID, IDREF oder IDREFS kombiniert werden, während die XML-Direktive nicht mit einer anderen Direktive, mit Ausnahme des Ausblendens, zulässig ist.

    Bei der cdata -Direktive werden die Daten von einem CDATA-Abschnitt umgeben. Der Inhalt ist nicht entitätscodiert. Der ursprüngliche Datentyp muss vom Typ Text sein ( varchar, nvarchar, textoder ntext). Diese Direktive kann nur mit hideverwendet werden. Wird diese Direktive verwendet, darf AttributeName nicht angegeben werden.

    Die Kombination von Direktiven zwischen diesen beiden Gruppen ist in den meisten Fällen zulässig, aber die Kombination zwischen ihnen selbst ist nicht zulässig.

Wenn Direktive und Attributname nicht angegeben werden, z. B. Customer!1, wird eine Elementdirektive impliziert, z. B. Customer!1!! Element- und Spaltendaten sind im ElementName enthalten.

Wird die xmltext -Direktive angegeben, wird der Spalteninhalt von einem einzelnen Tag umgeben, das in den Rest des Dokuments integriert wird. Diese Direktive erweist sich beim Abrufen von nicht verbrauchten XML-Überlaufdaten, die in einer Spalte mithilfe von OPENXML gespeichert wurden, als nützlich. Weitere Informationen finden Sie unter OPENXML (SQL Server).For more information, see OPENXML (SQL Server).

Wird AttributeName angegeben, wird der Tagname durch den angegebenen Namen ersetzt. Anderenfalls wird das Attribut an die aktuelle Liste der Attribute der einschließenden Elemente angefügt und der Inhalt ohne Entitätscodierung an den Anfang der Eingrenzung gesetzt. Die Spalte mit dieser Direktive muss vom Typ Text sein ( varchar, nvarchar, char, nchar, textoder ntext). Diese Direktive kann nur mit hideverwendet werden. Diese Direktive ist zum Abrufen von in einer Spalte gespeicherten Überlaufdaten nützlich. Wenn der Inhalt kein wohlgeformter XML-Code ist, ist das Verhalten nicht definiert.

Nächste Schritte

Die folgenden Beispiele veranschaulichen die Verwendung des EXPLICIT-Modus.

Siehe auch