Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wie im Thema beschrieben, bieten das Erstellen von XML unter Verwendung von FOR XML, RAW- und AUTO-Modus nicht viel Kontrolle über das Shape des XML-Codes, das aus einem Abfrageergebnis generiert wird. Der EXPLICIT-Modus bietet jedoch die größte Flexibilität beim Generieren des gewünschten XML-Codes aus einem Abfrageergebnis.
Die EXPLICIT-Modus-Abfrage muss auf eine bestimmte Weise geschrieben werden, sodass die zusätzlichen Informationen über die erforderliche XML,z. B. die erwartete Schachtelung in der XML, explizit als Teil der Abfrage angegeben werden. Je nach angeforderter XML kann das Schreiben von EXPLIZITen Modusabfragen umständlich sein. Möglicherweise stellen Sie fest, dass das Verwenden des PATH-Modus mit Schachtelung eine einfachere Alternative zum Schreiben von EXPLIZIT-Modus-Abfragen ist.
Da Sie den gewünschten XML-Code als Teil der Abfrage im EXPLICIT-Modus beschreiben, müssen Sie sicherstellen, dass die generierte XML wohlgeformt und gültig ist.
Rowset-Verarbeitung im expliziten Modus
Der EXPLICIT-Modus wandelt das Rowset, das aus der Abfrageausführung resultiert, in ein XML-Dokument um. Damit der EXPLIZITe Modus das XML-Dokument erzeugen kann, muss das Rowset ein bestimmtes Format aufweisen. Dazu müssen Sie die SELECT-Abfrage schreiben, um das Rowset, die universelle Tabelle, mit einem bestimmten Format zu erzeugen, damit die Verarbeitungslogik dann den gewünschten XML-Code erzeugen kann.
Zunächst muss die Abfrage die folgenden beiden Metadatenspalten erzeugen:
Die erste Spalte muss die Tagnummer, den ganzzahligen Typ des aktuellen Elements angeben, und der Spaltenname muss "Tag" sein. Ihre Abfrage muss für jedes Element, das aus dem Rowset erstellt wird, eine eindeutige Tagnummer angeben.
Die zweite Spalte muss eine Tagnummer des übergeordneten Elements angeben, und dieser Spaltenname muss übergeordnetes Element sein. Auf diese Weise stellen die Tag- und die übergeordnete Spalte Hierarchieinformationen bereit.
Diese Metadatenspaltenwerte werden zusammen mit den Informationen in den Spaltennamen verwendet, um den gewünschten XML-Code zu erzeugen. Beachten Sie, dass Ihre Abfrage Spaltennamen auf eine bestimmte Weise bereitstellen muss. Beachten Sie außerdem, dass eine 0 oder NULL in der übergeordneten Spalte angibt, dass das entsprechende Element kein übergeordnetes Element aufweist. Das Element wird dem XML-Code als Element der obersten Ebene hinzugefügt.
Um zu verstehen, wie die von einer Abfrage generierte universelle Tabelle in das Generieren von XML-Ergebnissen verarbeitet wird, gehen Sie davon aus, dass Sie eine Abfrage geschrieben haben, die diese universelle Tabelle erzeugt:
Beachten Sie Folgendes zu dieser universellen Tabelle:
Die ersten beiden Spalten sind Tag und Eltern und sind Meta-Spalten. Diese Werte bestimmen die Hierarchie.
Die Spaltennamen werden auf eine bestimmte Weise angegeben, wie weiter unten in diesem Thema beschrieben.
Beim Generieren des XML aus dieser universellen Tabelle werden die Daten in dieser Tabelle vertikal in Spaltengruppen unterteilt. Die Gruppierung wird basierend auf dem Tag-Wert und den Spaltennamen bestimmt. Beim Erstellen von XML wählt die Verarbeitungslogik eine Gruppe von Spalten für jede Zeile aus und erstellt ein Element. In diesem Beispiel gilt Folgendes:
Bei Tag-Spaltenwert 1 in der ersten Zeile bilden die Spalten, deren Namen die gleiche Tagnummer enthalten, "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 Thema 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 Zeilen mit Tag-Spaltenwert 3 bilden die Spalten OrderDetail!3!id!id und OrderDetail!3!pid!idref eine Gruppe. Jede dieser Zeilen generiert ein Element aus <
OrderDetail id=... pid=...>diesen Spalten.
Beachten Sie, dass die Zeilen beim Generieren der XML-Hierarchie in der Reihenfolge verarbeitet werden. Die XML-Hierarchie wird wie in der folgenden Abbildung dargestellt bestimmt:
Die erste Zeile gibt Tag-Wert 1 und 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">Die zweite Zeile identifiziert Tag Wert 2 und Parent Wert 1. 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">Die nächsten beiden Zeilen identifizieren den Tag-Wert 3 und den Parent-Wert 2. 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 2 als Tagnummer und 1 als nummer der übergeordneten Kategorie. 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>
Zusammengefasst: Die Werte in den Metaspalten Tag und Parent, die in den Spaltennamen angegebenen Informationen und die korrekte Reihenfolge der Zeilen erzeugen den gewünschten XML-Code, wenn Sie den EXPLICIT-Modus verwenden.
Universelle Reihenfolge von Tabellenzeilen
Beim Erstellen des XML werden die Zeilen in der universellen Tabelle in der Reihenfolge verarbeitet. Um die korrekten untergeordneten Instanzen abzurufen, die ihrem jeweiligen übergeordneten Element zugeordnet sind, müssen die Zeilen im Rowset so sortiert werden, dass auf jeden übergeordneten Knoten direkt seine untergeordneten Elemente folgen.
Angeben von Spaltennamen in einer universellen Tabelle
Beim Schreiben von EXPLICIT-Modus-Abfragen müssen Spaltennamen im resultierenden Rowset mithilfe dieses Formats angegeben werden. Sie stellen Transformationsinformationen bereit, einschließlich Element- und Attributnamen und anderen zusätzlichen Informationen, die mithilfe von Direktiven angegeben werden.
Dies ist das allgemeine Format:
ElementName!TagNumber!AttributeName!Directive
Es folgt die Beschreibung der Teile des Formats.
ElementName-
Ist der resultierende generische Bezeichner des Elements. Wenn " Customers " beispielsweise als ElementName angegeben wird, wird das <Customers-Element> generiert.
TagNumber
Ist ein eindeutiger Tagwert, der einem Element zugewiesen ist. Dieser Wert bestimmt mit Hilfe der beiden Metadatenspalten "Tag " und "Parent" die Schachtelung der Elemente im resultierenden XML.This value with the two metadata columns, Tag and Parent, determines the nesting of the elements in the result XML.
Attributname
Stellt den Namen des Attributs bereit, das im angegebenen ElementName erstellt werden soll. Dies ist das Verhalten, wenn die Direktive nicht angegeben ist.
Wenn die Direktive angegeben ist und es sich um XML, cdata oder Element handelt, wird dieser Wert verwendet, um ein untergeordnetes Element von ElementName zu erstellen, und der Spaltenwert wird hinzugefügt.
Wenn Sie die Direktive angeben, kann der Attributname leer sein. Beispiel: ElementName! TagNumber!! Richtlinie. In diesem Fall ist der Spaltenwert direkt im ElementName enthalten.
Richtlinie
Die Direktive ist optional, und Sie können sie verwenden, um zusätzliche Informationen für die Erstellung des XML-Codes bereitzustellen.
Die Richtlinie hat zwei Ziele.
Einer der Zwecke besteht darin, Werte als ID, IDREF und IDREFS zu codieren. Sie können ID-, IDREF- und IDREFS-Schlüsselwörter als Direktiven angeben. Diese Direktiven überschreiben die Attributtypen. Auf diese Weise können Sie Dokumentverknüpfungslinks erstellen.
Außerdem können Sie mithilfe der Direktive angeben, wie die Zeichenfolgendaten XML zugeordnet werden. Die Schlüsselwörter hide, element, elementxsinil, xml, xmltext und cdata können als Direktive verwendet werden. Die Hide-Direktive blendet den Knoten aus. Dies ist nützlich, wenn Sie Werte nur für Sortierzwecke abrufen, sie aber nicht in der resultierenden XML verwenden möchten.
Die Elementdirektive generiert ein enthaltenes Element anstelle eines Attributs. Die enthaltenen Daten werden als Entität codiert. Beispielsweise wird das < Zeichen zu <. Bei NULL-Spaltenwerten wird kein Element generiert. Wenn ein Element für Null-Spaltenwerte generiert werden soll, können Sie die Elementxsinil-Direktive angeben. Dadurch wird ein Element generiert, das das Attribut "xsi:nil=TRUE" aufweist.
Die XML-Direktive ist identisch mit einer Elementdirektive , mit der Ausnahme, dass keine Entitätscodierung auftritt. Beachten Sie, dass die Elementdirektive mit ID, IDREF oder IDREFS kombiniert werden kann, während die XML-Direktive nicht mit einer anderen Direktive, mit Ausnahme des Ausblendens, zulässig ist.
Die cdata-Direktive enthält die Daten, indem sie mit einem CDATA-Abschnitt umschlossen wird. Der Inhalt ist nicht entitätscodiert. Der ursprüngliche Datentyp muss ein Texttyp sein, z. B. varchar, nvarchar, text oder ntext. Diese Direktive kann nur mit ausblenden verwendet werden. Wenn diese Direktive verwendet wird, 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 die Direktive und der Attributname nicht angegeben werden, z. B. Customer!1, wird eine Elementdirektive impliziert, z. B. Customer!1!! Element- und Spaltendaten sind im ElementName enthalten.
Wenn die xmltext-Anweisung angegeben wird, wird der Spalteninhalt in einem einzelnen Tag eingeschlossen, das in das restliche Dokument integriert ist. Diese Direktive ist nützlich beim Abrufen von Überlauf-, unkonsumierten XML-Daten, die in einer Spalte von OPENXML gespeichert sind. Weitere Informationen finden Sie unter OPENXML (SQL Server).
Wenn "AttributeName" angegeben ist, wird der Tagname durch den angegebenen Namen ersetzt. Andernfalls wird das Attribut an die aktuelle Liste der Attribute der eingeschlossenen Elemente angefügt, indem der Inhalt am Anfang der Eindämmung ohne Entitätscodierung positioniert wird. Die Spalte mit dieser Direktive muss ein Texttyp sein, z. B. varchar, nvarchar, char, nchar, text oder ntext. Diese Direktive kann nur mit ausblenden verwendet werden. Diese Direktive ist hilfreich beim Abrufen von Überlaufdaten, die in einer Spalte gespeichert sind. Wenn der Inhalt kein wohlgeformter XML-Code ist, ist das Verhalten nicht definiert.
In diesem Abschnitt
Die folgenden Beispiele veranschaulichen die Verwendung des EXPLIZITEN Modus.
Siehe auch
Verwenden des RAW-Modus mit FOR XML
Verwenden des AUTO-Modus mit FOR XML
Verwenden des PATH-Modus mit FOR XML
SELECT (Transact-SQL)
FOR XML (SQL Server)