Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Referenzhandbuch » Systemobjekte » Systemprozeduren » Alphabetische Liste der Systemprozeduren

 

openxml-Systemprozedur

Erzeugt eine Ergebnismenge aus einem XML-Dokument.

Syntax
openxml( XML-Daten,
 XPath [, Parameter [, Namespaces ] ] )
WITH ( Spaltenname Spaltentyp [ XPath ],... )
Argumente
  • XML-Daten   Die XML-Daten, auf denen die Ergebnismenge basiert. Dies kann ein beliebiger Zeichenfolgenausdruck sein, wie etwa eine Konstante, eine Variable oder eine Spalte.

  • XPath   Eine Zeichenfolge, die eine XPath-Abfrage enthält. Mit XPath können Sie Muster angeben, die die Struktur des abzufragenden XML-Dokumentes beschreiben. Das in diesem Argument enthaltene XPath-Muster wählt die Knoten aus dem XML-Dokument. Jeder Knoten, der mit der XPath-Abfrage im zweiten XPath-Argument übereinstimmt, erzeugt eine Zeile in der Tabelle.

    Meta-Eigenschaften können nur in XPath-Argumenten der WITH-Klausel angegeben werden. Auf eine Meta-Eigenschaft wird innerhalb einer XPath-Abfrage so zugegriffen, als handele es sich um ein Attribut. Wenn Namespaces nicht angegeben wird, bindet das System standardmäßig das Präfix "mp" an den Uniform Resource Identifier (URI) urn:ianywhere-com:sa-xpath-metaprop. Wenn Namespaces angegeben wird, muss dieser URI an "mp" oder an ein anderes Präfix gebunden werden, damit auf die Meta-Eigenschaften der Abfrage zugegriffen werden kann. Meta-Eigenschaften berücksichtigen die Groß- und Kleinschreibung. Die openxml-Anweisung unterstützt die folgenden Meta-Eigenschaften:

    • @mp:id   Gibt eine ID für einen Knoten zurück, der innerhalb des XML-Dokumentes eindeutig ist. Die ID für einen bestimmten Knoten in einem bestimmten Dokument kann sich ändern, falls der Datenbankserver neu gestartet wird. Der Wert dieser Meta-Eigenschaft steigt mit der Dokumentordnung.

    • @mp:localname   Gibt den lokalen Teil des Knotennamens oder NULL zurück, falls der Knoten keinen Namen trägt.

    • @mp:prefix   Gibt den Präfixteil des Knotennamens oder NULL zurück, falls der Knoten keinen Namen trägt oder falls der Name kein Präfix hat.

    • @mp:namespaceuri   Gibt den URI des Namespaces zurück, dem der Knoten angehört, bzw. NULL, falls der Knoten sich in keinem Namespace befindet.

    • @mp:xmltext   Gibt eine Unterstruktur des XML-Dokuments in XML-Form zurück. Wenn Sie z.B. einen internen Knoten suchen, können Sie diese Meta-Eigenschaft dafür benutzen, dass eine XML-Zeichenfolge zurückgegeben wird, und nicht verkettete Werte der untergeordneten Textknoten.

  • Parameter   Gibt die Zuordnung an, die zwischen den XML-Daten und der Ergebnismenge verwendet werden sollte, wenn in der WITH-Klausel keine XPath-Abfrage angegeben wird. Wenn der Parameter Optionen nicht angegeben wird, ist das Standardverhalten, in der Ergebnismenge Attribute und Spalten zuzuordnen. Der Parameter Optionen kann einen der folgenden Werte annehmen:

    Wert Beschreibung
    1 XML-Attribute werden in der Ergebnismenge Spalten zugeordnet (Standardeinstellung).
    2 XML-Elemente werden in der Ergebnismenge Spalten zugeordnet.

  • Namespaces   Ein XML-Dokument. Die bekannten Namespaces ("in-scope namespaces") für die Abfrage werden aus dem Wurzelelement des Dokumentes entnommen. Wenn Namespaces angegeben werden, müssen Sie das Argument Optionen einbeziehen, auch wenn alle XPath-Argumente angegeben werden.

  • WITH-Klausel   Gibt das Schema der Ergebnismenge an und wie der Wert für jede einzelne Spalte in der Ergebnismenge gefunden wird. XPath-Argumente in der WITH-Klausel werden entsprechend den Übereinstimmungen mit XPath im zweiten Argument zugeordnet. Wenn ein WITH-Klausel-Ausdruck mehr als einen Knoten findet, wird nur der erste Knoten in der Dokumentordnung verwendet. Falls es sich bei dem Knoten nicht um einen Textknoten handelt, wird das Ergebnis gefunden, indem alle untergeordneten Elemente des Textknotens angehängt werden. Wenn ein WITH-Klausel-Ausdruck mit keinem der Knoten übereinstimmt, ist die Spalte für die betreffende Zeile NULL.

    Die Syntax der openxml WITH-Klausel ähnelt der Syntax für SELECT aus einer gespeicherten Prozedur.

    Hinweise für SELECT aus einer gespeicherten Prozedur finden Sie unter FROM-Klausel.

  • Spaltenname   Name der Spalte in der Ergebnismenge

  • Spaltentyp   Datentyp der Spalte in der Ergebnismenge. Der Datentyp muss mit den aus dem XML-Dokument ausgewählten Werten kompatibel sein. Weitere Hinweise finden Sie unter SQL-Datentypen.

Verwendungszweck

Die openxml-Systemprozedur analysiert die XML-Daten syntaktisch und modelliert das Ergebnis als Struktur. Die Struktur enthält für jedes einzelne Element, Attribut, für jeden Textknoten bzw. für jedes sonstige XML-Konstrukt einen separaten Knoten. Die in der openxml-Systemprozedur angegebenen XPath-Abfragen werden verwendet, um Knoten von der Struktur auszuwählen, und die ausgewählten Knoten werden dann der Ergebnismenge zugeordnet.

Der XML-Parser der openxml-Systemprozedur überprüft die Gültigkeit des XML nicht und liest weder die externe DTD-Teilmenge noch externe Parameter-Entities.

Wenn für einen Spaltenausdruck mehrere Übereinstimmungen vorhanden sind, wird die erste Übereinstimmung in der Dokumentordnung verwendet (die Ordnung des ursprünglichen XML-Dokuments, bevor es syntaktisch analysiert wurde). NULL wird zurückgegeben, wenn es keine übereinstimmenden Knoten gibt. Wenn ein interner Knoten ausgewählt wird, enthält das Ergebnis alle untergeordneten Textknoten des internen Knotens in verketteter Form.

Für Spalten vom Typ BINARY, LONG BINARY, IMAGE und VARBINARY wird das Format Base64-kodiert angenommen und sie werden automatisch dekodiert. Wenn Sie XML mit der Klausel FOR XML generieren, werden diese Typen Base64-kodiert und können mit der openxml-Systemprozedur dekodiert werden. Weitere Hinweise finden Sie unter FOR XML und Binärdaten.

Die openxml-Systemprozedur unterstützt eine Teilmenge der XPath-Syntax, und zwar wie folgt:

  • Die Achsen "child", "self", "attribute", "descendant", "descendant-or-self" und "parent" werden vollständig unterstützt.

  • Sowohl abgekürzte als auch nicht abgekürzte Syntax kann für alle unterstützten Funktionen verwendet werden. Beispiel: 'a' ist gleichwertig mit 'child::a' und '..' ist gleichwertig mit 'parent::node()'.

  • Namenstests können Platzhalter verwenden. Zum Beispiel, 'a/*/b'.

  • Die folgenden "Kind"-Tests werden unterstützt: node(), text(), processing-instruction() und comment().

  • Qualifizierer der Form Ausdr1[Ausdr2] und Ausdr1[Ausdr2="Zeichenfolge" ] können verwendet werden, wobei Ausdr2 ein beliebiger unterstützter XPath-Ausdruck ist. Ein Qualifizierer ergibt TRUE, wenn Ausdr2 mit einem oder mehreren Knoten übereinstimmt. Beispiel: 'a[b]' findet a-Knoten, die zumindest ein b-Kind-Objekt (Child) haben, und a[b="I"] findet a-Knoten, die zumindest ein b-Kind-Objekt (Child) mit einem Textwert von I haben.

Siehe auch
Beispiel

Die folgende Abfrage erzeugt eine Ergebnismenge aus dem XML-Dokument, das als erstes Argument der openxml-Systemprozedur angegeben wurde:

SELECT * FROM openxml( '<products>
                 <ProductType ID="301">Tee Shirt</ProductType>
                 <ProductType ID="401">Baseball Cap</ProductType>
                 </products>',
                 '/products/ProductType' )
WITH ( ProductName LONG VARCHAR 'text()', ProductID CHAR(3) '@ID');

Diese Abfrage erzeugt das folgende Ergebnis:

ProductName ProductID
Tee Shirt 301
Baseball Cap 401

Im folgenden Beispiel enthält das erste <ProductType>-Element eine Entität. Wenn Sie eine Abfrage ausführen, wird dieser Knoten syntaktisch als ein Element mit vier Child-Objekten analysiert: Tee, &amp;, Sweater und Set. Sie können einen Punkt (.) verwenden, um die Child-Objekte in der Ergebnismenge zu verketten.

SELECT * FROM openxml( '<products>
                 <ProductType ID="301">Tee &amp; Sweater Set</ProductType>
                 <ProductType ID="401">Baseball Cap</ProductType>
                 </products>',
                 '/products/ProductType' )
WITH ( ProductName LONG VARCHAR '.', ProductID CHAR(3) '@ID');

Diese Abfrage erzeugt das folgende Ergebnis:

ProductName ProductID
Tee Shirt & Sweater Set 301
Baseball Cap 401

Die folgende Abfrage verwendet ein Gleichheitsprädikat, um eine Ergebnismenge aus dem gelieferten XML-Dokument zu generieren.

SELECT * FROM openxml('<EmployeeDirectory>
   <Employee>
      <column name="EmployeeID">105</column>
      <column name="GivenName">Matthew</column>
      <column name="Surname">Cobb</column>
      <column name="Street">7 Pleasant Street</column>
      <column name="City">Grimsby</column>
      <column name="State">UT</column>
      <column name="PostalCode">02154</column>
      <column name="Phone">6175553840</column>
   </Employee>
  <Employee>
      <column name="EmployeeID">148</column>
      <column name="GivenName">Julie</column>
      <column name="Surname">Jordan</column>
      <column name="Street">1244 Great Plain Avenue</column>
      <column name="City">Woodbridge</column>
      <column name="State">AZ</column>
      <column name="PostalCode">01890</column>
      <column name="Phone">6175557835</column>
   </Employee>
  <Employee>
      <column name="EmployeeID">160</column>
      <column name="GivenName">Robert</column>
      <column name="Surname">Breault</column>
      <column name="Street">358 Cherry Street</column>
      <column name="City">Milton</column>
      <column name="State">PA</column>
      <column name="PostalCode">02186</column>
      <column name="Phone">6175553099</column>
   </Employee>
  <Employee>
      <column name="EmployeeID">243</column>
      <column name="GivenName">Natasha</column>
      <column name="Surname">Shishov</column>
      <column name="Street">151 Milk Street</column>
      <column name="City">Grimsby</column>
      <column name="State">UT</column>
      <column name="PostalCode">02154</column>
      <column name="Phone">6175552755</column>
   </Employee> 
</EmployeeDirectory>', '/EmployeeDirectory/Employee')
WITH ( EmployeeID INT 'column[@name="EmployeeID"]',
       GivenName    CHAR(20) 'column[@name="GivenName"]',
       Surname      CHAR(20) 'column[@name="Surname"]',
       PhoneNumber  CHAR(10) 'column[@name="Phone"]');

Diese Abfrage erzeugt die folgende Ergebnismenge:

EmployeeID GivenName Surname PhoneNumber
105 Matthew Cobb 6175553840
148 Julie Jordan 6175557835
160 Robert Breault 6175553099
243 Natasha Shishov 6175552755

Die folgende Abfrage verwendet den XPath-Ausdruck @attribute, um eine Ergebnismenge zu generieren:

SELECT * FROM openxml( '<Employee
      EmployeeID="105"
      GivenName="Matthew"
      Surname="Cobb"
      Street="7 Pleasant Street"
      City="Grimsby"
      State="UT"
      PostalCode="02154"
      Phone="6175553840"
/>', '/Employee' )
WITH ( EmployeeID INT '@EmployeeID',
       GivenName    CHAR(20) '@GivenName',
       Surname      CHAR(20) '@Surname',
       PhoneNumber  CHAR(10) '@Phone');

Die folgende Abfrage verarbeitet ein XML-Dokument wie jenes in der obenstehenden Abfrage, nur dass ein XML-Namespace verwendet wird. Es veranschaulicht die Verwendung von Platzhaltern im Namenstest bei der XPath-Abfrage und generiert dieselbe Ergebnismenge wie die obenstehende Abfrage.

SELECT * FROM openxml( '<Employee  xmlns="http://www.iAnywhere.com/EmployeeDemo"
      EmployeeID="105"
      GivenName="Matthew"
      Surname="Cobb"
      Street="7 Pleasant Street"
      City="Grimsby"
      State="UT"
      PostalCode="02154"
      Phone="6175553840"
/>', '/*:Employee' )

WITH ( EmployeeID INT '@EmployeeID',
       GivenName    CHAR(20) '@GivenName',
       Surname      CHAR(20) '@Surname',
       PhoneNumber  CHAR(10) '@Phone');

Als Alternative können Sie eine Namespace-Deklaration angeben:

SELECT * FROM openxml( '<Employee  xmlns="http://www.iAnywhere.com/EmployeeDemo"
      EmployeeID="105"
      GivenName="Matthew"
      Surname="Cobb"
      Street="7 Pleasant Street"
      City="Grimsby"
      State="UT"
      PostalCode="02154"
      Phone="6175553840"
/>', '/prefix:Employee', 1, '<r xmlns:prefix="http://www.iAnywhere.com/EmployeeDemo"/>' )
WITH ( EmployeeID INT '@EmployeeID',
       GivenName    CHAR(20) '@GivenName',
       Surname      CHAR(20) '@Surname',
       PhoneNumber  CHAR(10) '@Phone');

Weitere Beispiele zur Verwendung der openxml-Systemprozedur finden Sie unter XML mit openxml importieren.