Freigeben über


Ausdruckskontext und Ausdrucksauswertung (XQuery)

Gilt für:SQL Server

Der Kontext eines Ausdrucks sind die Informationen, die zum Analysieren und Auswerten des Ausdrucks verwendet werden. Die Auswertung von XQuery erfolgt in den folgenden beiden Phasen:

  • Statischer Kontext : Dies ist die Abfragekompilierungsphase. Auf der Basis der verfügbaren Informationen werden während dieser statischen Analyse der Abfrage manchmal Fehler ausgelöst.

  • Dynamischer Kontext : Dies ist die Abfrageausführungsphase. Selbst wenn eine Abfrage keine statischen Fehler wie z. B. Fehler während der Abfragekompilierung aufweist, kann die Abfrage trotzdem während ihrer Ausführung Fehler auslösen.

Statischer Kontext

Als Initialisierung des statischen Kontexts wird der Prozess bezeichnet, in dem alle Informationen für die statische Analyse des Ausdrucks zusammengestellt werden. Im Rahmen der Initialisierung des statischen Kontexts werden die folgenden Schritte durchgeführt:

  • Die Begrenzungs-Leerraumrichtlinie ist auf Strip festgelegt. Daher wird der Begrenzungsweißraum von den Element- und Attributkonstruktoren in der Abfrage nicht beibehalten. Beispiel:

    declare @x xml  
    set @x=''  
    select @x.query('<a>  {"Hello"}  </a>,  
    
        <b> {"Hello2"}  </b>')  
    

    Diese Abfrage gibt das folgende Ergebnis zurück, weil das Grenzleerzeichen beim Analysieren des XQuery-Ausdrucks entfernt wird:

    <a>Hello</a><b>Hello2</b>  
    
  • Das Präfix und die Namespacebindung werden für folgende Namespaces initialisiert:

    • Einen Satz von vordefinierten Namespaces.

    • Alle mithilfe von WITH XMLNAMESPACES definierten Namespaces. Weitere Informationen finden Sie unter Hinzufügen von Namespaces zu Abfragen mit WITH XMLNAMESPACES).

    • Alle im Abfrageprolog definierten Namespaces. Beachten Sie, dass die Namespacedeklarationen im Prolog die Namespacedeklaration in WITH XMLNAMESPACES überschreiben können. In der folgenden Abfrage deklariert WITH XMLNAMESPACES beispielsweise ein Präfix (pd), das es an den Namespace (https://someURI) bindet. Diese Bindung wird jedoch in der WHERE-Klausel durch den Abfrageprolog überschrieben.

      WITH XMLNAMESPACES ('https://someURI' AS pd)  
      SELECT ProductModelID, CatalogDescription.query('  
          <Product   
              ProductModelID= "{ sql:column("ProductModelID") }"   
              />  
      ') AS Result  
      FROM Production.ProductModel  
      WHERE CatalogDescription.exist('  
          declare namespace  pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           /pd:ProductDescription[(pd:Specifications)]'  
          ) = 1  
      

    Alle diese Namespacebindungen werden bei der Initialisierung des statischen Kontexts aufgelöst.

  • Beim Abfragen einer typisierten XML-Spalte oder -Variablen werden die Komponenten der XML-Schemaauflistung, die der Spalte oder Variablen zugeordnet ist, in den statischen Kontext importiert. Weitere Informationen finden Sie unter Vergleichen von typisiertem XML mit nicht typisiertem XML.

  • Für jeden atomaren Typ in den importierten Schemas wird im statischen Kontext auch eine Umwandlungsfunktion verfügbar gemacht. Dies wird im folgenden Beispiel veranschaulicht. In diesem Beispiel wird eine Abfrage für eine typisierte xml-Variable angegeben. Die dieser Variablen zugeordnete XML-Schemaauflistung definiert den atomaren Typ myType. Entsprechend diesem Typ ist die Umwandlungsfunktion myType()während der statischen Analyse verfügbar. Der Abfrageausdruck (ns:myType(0)) gibt einen Wert von myType zurück.

    -- DROP XML SCHEMA COLLECTION SC  
    -- go  
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema"   
    targetNamespace="myNS" xmlns:ns="myNS"  
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">  
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>  
          <simpleType name="myType">  
                <restriction base="int">  
                 <enumeration value="0" />  
                  <enumeration value="1"/>  
                </restriction>  
          </simpleType>  
          <element name="root" type="ns:myType"/>  
    </schema>'  
    go  
    
    DECLARE @var XML(SC)  
    SET @var = '<root xmlns="myNS">0</root>'  
    -- specify myType() casting function in the query  
    SELECT @var.query('declare namespace ns="myNS"; ns:myType(0)')  
    

    Im folgenden Beispiel wird die Umwandlungsfunktion für den integrierten XML-Typ int im Ausdruck angegeben.

    declare @x xml  
    set @x = ''  
    select @x.query('xs:int(5)')  
    go  
    

Nachdem der statische Kontext initialisiert wurde, wird der Abfrageausdruck analysiert (kompiliert). Die statische Analyse umfasst die folgenden Schritte:

  1. Analysieren der Abfrage.

  2. Auflösen der im Ausdruck angegebenen Funktions- und Typnamen.

  3. Statisches Typisieren der Abfrage. Damit wird sichergestellt, dass die Abfrage typsicher ist. Die folgende Abfrage gibt z. B. einen statischen Fehler zurück, da der + Operator numerische primitive Typargumente erfordert:

    declare @x xml  
    set @x=''  
    SELECT @x.query('"x" + 4')  
    

    Im folgenden Beispiel erfordert der value() -Operator ein Singleton. Wie im XML-Schema angegeben, kann es mehrere <Elem-Elemente> geben. Bei der statischen Analyse des Ausdrucks wird ermittelt, dass der Ausdruck nicht typsicher ist, und es wird ein statischer Fehler zurückgegeben. Um den Fehler aufzulösen, muss der Ausdruck so umgeschrieben werden, dass er explizit einen Singleton-Wert angibt (data(/x:Elem)[1]).

    DROP XML SCHEMA COLLECTION SC  
    go  
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema"   
    targetNamespace="myNS" xmlns:ns="myNS"  
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">  
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>  
          <element name="Elem" type="string"/>  
    </schema>'  
    go  
    
    declare @x xml (SC)  
    set @x='<Elem xmlns="myNS">test</Elem><Elem xmlns="myNS">test2</Elem>'  
    SELECT @x.value('declare namespace x="myNS"; data(/x:Elem)[1]','varchar(20)')  
    

    Weitere Informationen finden Sie unter XQuery und statische Typisierung.

Einschränkungen für die Implementierung

Im Zusammenhang mit dem statischen Kontext gelten die folgenden Einschränkungen:

  • Der XPath-Kompatibilitätsmodus wird nicht unterstützt.

  • Für die XML-Konstruktion wird nur der strip-Konstruktionsmodus unterstützt. Dies ist die Standardeinstellung. Daher ist der Typ des erstellten Elementknotens vom Typ xdt:untyped , und die Attribute sind vom Typ xdt:untypedAtomic .

  • Es wird nur der der ordered-Sortiermodus strip XML unterstützt.

  • Es wird nur die strip-XML-Leerzeichenrichtlinie unterstützt.

  • Die Basis-URI-Funktionalität wird nicht unterstützt.

  • fn:doc() wird nicht unterstützt.

  • fn:collection() wird nicht unterstützt.

  • Es wird kein statischer Flagger für XQuery bereitgestellt.

  • Die dem xml-Datentyp zugeordnete Sortierung wird verwendet. Diese Sortierreihenfolge ist immer auf die Unicode-Codepunktsortierreichenfolge festgelegt.

Dynamischer Kontext

Unter dem dynamischen Kontext werden die Informationen verstanden, die zum Zeitpunkt der Ausführung des Ausdrucks verfügbar sein müssen. Zusätzlich zum statischen Kontext werden die folgenden Informationen als Bestandteil des dynamischen Kontexts initialisiert:

  • Der Schwerpunkt des Ausdrucks, z. B. das Kontext-Item, die Kontextposition und die Kontextgröße, werden entsprechend dem folgenden Beispiel initialisiert. Beachten Sie, dass alle diese Werte von der nodes()-Methode überschrieben werden können.

    • Der xml-Datentyp legt das Kontextelement, den zu verarbeitenden Knoten, auf den Dokumentknoten fest.

    • Die Kontextposition, also die Position des Kontext-Items im Verhältnis zu den gerade verarbeiteten Knoten, wird auf 1 festgelegt.

    • Die Kontextgröße, also die Anzahl der Items in der Sequenz, die gerade verarbeitet wird, wird zunächst auf 1 festgelegt, weil es immer einen Dokumentknoten gibt.

Einschränkungen für die Implementierung

Im Zusammenhang mit dem dynamischen Kontext gelten die folgenden Einschränkungen:

  • Die Aktuellen Datums- und Uhrzeitkontextfunktionenfn:current-date, fn:current-time und fn:current-dateTime werden nicht unterstützt.

  • Die implizite Zeitzone ist auf UTC+0 festgelegt und kann nicht geändert werden.

  • Die fn:doc() -Funktion wird nicht unterstützt. Alle Abfragen werden für Spalten oder Variablen vom Xml-Typ ausgeführt.

  • Die fn:collection() -Funktion wird nicht unterstützt.

Weitere Informationen

XQuery-Grundlagen
Vergleichen von typisiertem XML mit nicht typisiertem XML
XML-Schemaauflistungen (SQL Server)