Angeben von Metaeigenschaften in OPENXML

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

Metaeigenschaftsattribute in einem XML-Dokument sind Attribute, die die Eigenschaften eines XML-Objekts (z. B. Element, Attribut oder ein beliebiger anderer DOM-Knoten) beschreiben. Diese Attribute sind im XML-Dokumenttext nicht physisch vorhanden. Vielmehr stellt OPENXML diese Metaeigenschaften für alle XML-Objekte bereit. Die Metaeigenschaften ermöglichen es Ihnen, Informationen (wie etwa die relative Position oder Namespaceinformationen) über XML-Knoten zu extrahieren. Diese Informationen bieten Ihnen mehr Details, als in der Textdarstellung zu sehen sind.

Sie können diese Metaeigenschaften Rowsetspalten in einer OPENXML-Anweisung mithilfe des ColPattern -Parameters zuordnen. Die Spalten enthalten die Werte der Metaeigenschaften, denen sie zugeordnet sind. Weitere Informationen zur Syntax von OPENXML finden Sie unter OPENXML (Transact-SQL).For more information about the syntax of OPENXML, see OPENXML (Transact-SQL).

Für den Zugriff auf die Metaeigenschaftsattribute wird ein für SQL Server spezifischer Namespace bereitgestellt. Dieser Namespace ermöglicht es dem Benutzer, urn:schemas-microsoft-com:xml-metaprop auf die Metaeigenschaftsattribute zuzugreifen. Wenn das Ergebnis einer OPENXML-Abfrage in einem Randtabellenformat zurückgegeben wird, enthält die Randtabelle eine Spalte für jedes Metaproperty-Attribut, mit Ausnahme der xmltext Metaeigenschaft.

Einige der Metaeigenschaftsattribute werden zu Verarbeitungszwecken eingesetzt. Beispielsweise wird das xmltext Metaproperty-Attribut für die Überlaufbehandlung verwendet. Die Bearbeitung von Überlaufdaten bezieht sich auf nicht verbrauchte, unverarbeitete Daten im Dokument. Eine der Spalten im von OPENXML generierten Rowset kann als Überlaufspalte identifiziert werden. Dies geschieht, indem Sie sie der xmltext Metaeigenschaft mithilfe des ColPattern-Parameters zuordnen. Die Spalte nimmt dann die Überlaufdaten auf. Der flags -Parameter bestimmt, ob die Spalte ausschließlich nicht verbrauchte Daten oder alle Daten enthalten soll.

In der folgenden Tabelle werden die Metaeigenschaftsattribute für jedes analysierte XML-Element aufgeführt. Auf diese Metaeigenschaftsattribute kann mithilfe des Namespace urn:schemas-microsoft-com:xml-metapropzugegriffen werden. Jeder Wert, der direkt vom Benutzer im XML-Dokument mithilfe dieser Metaeigenschaften festgelegt wird, bleibt unberücksichtigt.

Hinweis

Sie können in XPath-Navigationen nicht auf diese Metaeigenschaften verweisen.

Metaeigenschaftsattribut Beschreibung
@mp:id Stellt einen systemgenerierten, dokumentweiten Bezeichner des DOM-Knotens bereit. Solange das Dokument nicht analysiert wird, bezieht sich diese ID auf denselben XML-Knoten.

Eine XML-ID von 0 gibt an, dass das Element ein Stammelement ist. Die übergeordnete XML-ID ist NULL.
@mp:localname Speichert den lokalen Teil des Knotennamens. Die Metaeigenschaft wird mit einem Präfix und einem Namespace-URI (Uniform Resource Identifier) zur Benennung von Element- oder Attributknoten verwendet.
@mp:namespaceuri Gibt den Namespace-URI des aktuellen Elements an. Ist der Wert dieses Attributs NULL, ist kein Namespace vorhanden.
@mp:prefix Speichert das Namespacepräfix des aktuellen Elementnamens.

Wenn kein Präfix vorhanden ist (NULL) und ein URI angegeben ist, zeigt dieses Attribut an, dass der angegebene Namespace der Standardnamespace ist. Ist kein URI angegeben, wird kein Namespace angefügt.
@mp:prev Speichert das vorhergehende gleichgeordnete Objekt eines Knotens. Dadurch werden Informationen über die Reihenfolge der Elemente im Dokument bereitgestellt.

@mp:prev enthält die XML-ID des vorhergehenden gleichgeordneten Objekts, das über dasselbe übergeordnete Element verfügt. Wird ein Element am Anfang der Liste der gleichgeordneten Objekte aufgeführt, ist @mp:prev gleich NULL.
@mp:xmltext Wird zu Verarbeitungszwecken genutzt. Legt die Textserialisierung des Elements und der zugehörigen Attribute und auch die Teilelemente fest, wie dies bei der Überlaufbearbeitung von OPENXML der Fall ist.

In dieser Tabelle werden die zusätzlichen Eigenschaften übergeordneter Metaeigenschaftsattribute dargestellt, die Ihnen das Abrufen von Hierarchieinformationen ermöglichen.

Übergeordnetes Metaeigenschaftsattribut Beschreibung
@mp:parentid Entspricht ../\@mp:id
@mp:parentlocalname Entspricht ../\@mp:localname
@mp:parentnamespacerui Entspricht ../\@mp:namespaceuri
@mp:parentprefix Entspricht ../\@mp:prefix

Beispiele

In den folgenden Beispielen wird die Verwendung von OPENXML zum Erstellen unterschiedlicher Rowsetsichten veranschaulicht.

A. Zuordnen der OPENXML-Rowsetspalten zu den Metaeigenschaften

In diesem Beispiel wird OPENXML zum Erstellen einer Rowsetsicht des XML-Beispieldokuments verwendet. Es veranschaulicht das Zuordnen verschiedener Metaeigenschaftsattribute zu Rowsetspalten in der OPENXML-Anweisung mithilfe des ColPattern -Parameters.

Die OPENXML-Anweisung verdeutlicht Folgendes:

  • Die id Spalte wird dem @mp:id Metaproperty-Attribut zugeordnet und gibt an, dass die Spalte die vom System generierte eindeutige XML-ID des Elements enthält.

  • Die parent Spalte ist zugeordnet @mp:parentid und gibt an, dass die Spalte die XML-ID des übergeordneten Elements enthält.

  • Die parentLocalName Spalte ist zugeordnet @mp:parentlocalname und gibt an, dass die Spalte den lokalen Namen des übergeordneten Elements enthält.

Schließlich gibt die SELECT-Anweisung das von OPENXML bereitgestellte Rowset zurück.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- Sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (id int '@mp:id',
            oid char(5),
            date datetime,
            amount real,
            parentIDNo int '@mp:parentid',
            parentLocalName varchar(40) '@mp:parentlocalname');
EXEC sp_xml_removedocument @idoc;

Dies ist das Ergebnis:

id   oid         date                amount    parentIDNo  parentLocalName
--- ------- ---------------------- ---------- ------------ ---------------
6    O1    1996-01-20 00:00:00.000     3.5         2        Customer
10   O2    1997-04-30 00:00:00.000     13.4        2        Customer
19   O3    1999-07-14 00:00:00.000     100.0       15       Customer
25   O4    1996-01-20 00:00:00.000     10000.0     15       Customer

B. Abrufen des gesamten XML-Dokuments

In diesem Beispiel wird mithilfe von OPENXML eine einspaltige Rowsetsicht des XML-Beispieldokuments erstellt. Diese Spalte Col1ist der xmltext Metaeigenschaft zugeordnet und wird zu einer Überlaufspalte. Deshalb nimmt die Spalte die nicht verbrauchten Daten auf. In diesem Fall ist es das gesamte Dokument.

Schließlich gibt die SELECT-Anweisung das vollständige Rowset zurück.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
SET @doc = N'<?xml version="1.0"?>
<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very
             satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
             white red">
     <MyTag>Testing to see if all the subelements are returned</MyTag>
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/')
   WITH (Col1 ntext '@mp:xmltext')

Um das gesamte Dokument ohne die XML-Deklaration abzurufen, kann die Abfrage wie folgt angegeben werden:

SELECT *
FROM OPENXML (@idoc, '/root')
   WITH (Col1 ntext '@mp:xmltext')
EXEC sp_xml_removedocument @idoc;

Die Abfrage gibt das Stammelement mit dem Namensstammverzeichnis sowie die Daten des Stammelements zurück.

C. Angeben der xmltext-Metaeigenschaft zur Abfrage der nicht verbrauchten Daten in einer Spalte

In diesem Beispiel wird OPENXML zum Erstellen einer Rowsetsicht des XML-Beispieldokuments verwendet. Das Beispiel zeigt, wie unkonsumierte XML-Daten abgerufen werden, indem das xmltext Metaproperty-Attribut einer Rowsetspalte in OPENXML zugeordnet wird.

Die comment Spalte wird als Überlaufspalte identifiziert, indem sie der @mp:xmltext Metaeigenschaft zugeordnet wird. Der Flags-Parameter ist auf 9 (XML_ATTRIBUTE und XML_NOCOPY) festgelegt. Dies gibt die attribute-centric Zuordnung an und gibt an, dass nur die nicht fortgesetzten Daten in die Überlaufspalte kopiert werden sollen.

Schließlich gibt die SELECT-Anweisung das von OPENXML bereitgestellte Rowset zurück.

In diesem Beispiel wird die @mp:parentlocalname Metaeigenschaft für eine Spalte im ParentLocalNamevon OPENXML generierten Rowset festgelegt. Folglich enthält diese Spalte den lokalen Namen des übergeordneten Elements.

Zwei zusätzliche Spalten werden im Rowset angegeben, parent und comment. Die parent Spalte ist zugeordnet @mp:parentid und gibt an, dass die Spalte die XML-ID des übergeordneten Elements des Elements enthält. Die comment-Spalte wird als Überlaufspalte durch Zuordnen zur @mp:xmltext -Metaeigenschaft).

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>
';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (oid char(5),
            date datetime,
            comment ntext '@mp:xmltext');
EXEC sp_xml_removedocument @idoc;

Dies ist das Ergebnis. Da die Oidspalten und Datumsspalten bereits genutzt werden, werden sie nicht in der Überlaufspalte angezeigt.

oid   date                        comment
----- --------------------------- ----------------------------------------
O1    1996-01-20 00:00:00.000     <Order amount="3.5"/>
O2    1997-04-30 00:00:00.000     <Order amount="13.4">Customer was very
                                   satisfied</Order>
O3    1999-07-14 00:00:00.000     <Order amount="100" note="Wrap it blue
                                   white red"><Urgency>
                                   Important</Urgency></Order>
O4    1996-01-20 00:00:00.000     <Order amount="10000"/>

Siehe auch