Uttryckskontext och frågeutvärdering (XQuery)

Gäller för:SQL Server

Kontexten för ett uttryck är den information som används för att analysera och utvärdera det. Följande är de två faser i vilka XQuery utvärderas:

  • Statisk kontext – Detta är fasen för frågekompilering. Baserat på den tillgängliga informationen kan fel ibland uppstå under denna statiska analys av frågan.

  • Dynamisk kontext – Detta är frågeexekveringsfasen. Även om en fråga inte har statiska fel, såsom fel under frågekompilering, kan frågan returnera fel under körningen.

Statisk kontext

Statisk kontextinitialisering avser processen att sammanställa all information för statisk analys av uttrycket. Som en del av statisk kontextinitiering slutförs följande:

  • Gränsens vita utrymmespolicy är inställd på att strippa. Därför bevaras inte det vita utrymmet för gränsen av några element- och attributkonstruktörer i frågan. Ett exempel:

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

    Denna fråga ger följande resultat, eftersom randutrymmet tas bort under parsningen av XQuery-uttrycket:

    <a>Hello</a><b>Hello2</b>  
    
  • Prefixet och namnrymdsbindningen initieras för följande:

    • En uppsättning fördefinierade namnrymder.

    • Alla namnrymder definierade med WITH XMLNAMESPACES. För mer information, se Lägg till namnrymder till frågor med MED XMLNAMNSRYMDER).

    • Alla namnrymder definierade i frågeprologen. Observera att namnrymdeklarationerna i prologen kan åsidosätta namnrymdedeklarationen i WITH XMLNAMESPACES. Till exempel, i följande fråga deklarerar WITH XMLNAMESPACES ett prefix (pd) som binder det till namespace (https://someURI). Men i WHERE-klausulen åsidosätter frågeprologen bindningen.

      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  
      

    Alla dessa namnrymdsbindningar löses under statisk kontextinitialisering.

  • Om man frågar en typad xml-kolumn eller variabel importeras komponenterna i XML-schemasamlingen som är kopplade till kolumnen eller variabeln till den statiska kontexten. Mer information finns i Jämför typerad XML med otypad XML.

  • För varje atomär typ i de importerade scheman görs även en castingfunktion tillgänglig i det statiska sammanhanget. Detta illustreras i följande exempel. I detta exempel specificeras en fråga mot en typad xml-variabel . XML-schemasamlingen som är kopplad till denna variabel definierar en atomär typ, myType. Motsvarande denna typ finns en gjutningsfunktion, myType(), tillgänglig under den statiska analysen. Frågeuttrycket (ns:myType(0)) returnerar ett värde av myType.

    -- 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)')  
    

    I följande exempel specificeras casting-funktionen för den int inbyggda XML-typen i uttrycket.

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

Efter att den statiska kontexten initierats analyseras (kompilerades) frågeuttrycket. Den statiska analysen omfattar följande:

  1. Frågeparsing.

  2. Lösningen av funktions- och typnamnen som anges i uttrycket.

  3. Statisk typning av frågan. Detta säkerställer att frågan är typsäker. Till exempel ger följande fråga ett statiskt fel, eftersom operatorn + kräver numeriska primitiva typargument:

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

    I följande exempel kräver value()- operatorn en singleton. Som specificerat i XML-schemat kan det finnas flera <Elem-element> . Statisk analys av uttrycket fastställer att det inte är typsäkert och ett statiskt fel returneras. För att lösa felet måste uttrycket skrivas om för att explicit specificera en singel (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)')  
    

    Mer information finns i XQuery och Static Typing.

Implementeringsbegränsningar

Följande är begränsningarna relaterade till statisk kontext:

  • XPath-kompatibilitetsläge stöds inte.

  • För XML-konstruktion stöds endast rembyggarläget. Det här är standardinställningen. Därför är typen av den konstruerade elementnoden av xdt:otypad typ och attributen av xdt:otypadAtomär typ.

  • Endast orderorder-läget stöds.

  • Endast policy för att strippa XML-utrymme stöds.

  • Bas-URI-funktionalitet stöds inte.

  • FN:doc() stöds inte.

  • FN:collection() stöds inte.

  • XQuery statisk flaggare finns inte med.

  • Sorteringen som är kopplad till xml-datatypen används. Denna sortering sätts alltid till Unicode-kodpunktskollationen.

Dynamisk kontext

Dynamisk kontext avser den information som måste finnas tillgänglig vid tidpunkten för att uttrycket exekveras. Utöver den statiska kontexten initieras följande information som en del av den dynamiska kontexten:

  • Uttrycksfokuset, såsom kontextobjektet, kontextpositionen och kontextstorleken, initieras som visas nedan. Observera att alla dessa värden kan åsidosättas av nodes()-metoden.

    • XML-datatypen sätter kontextobjektet, noden som bearbetas, till dokumentnoden.

    • Kontextpositionen, positionen för kontextobjektet i förhållande till de noder som bearbetas, sätts först till 1.

    • Kontextstorleken, antalet objekt i sekvensen som bearbetas, sätts först till 1, eftersom det alltid finns en dokumentnod.

Implementeringsbegränsningar

Följande är begränsningarna relaterade till dynamisk kontext:

  • Nuvarande datum och tid i kontextfunktionerna, fn:current-date, fn:current-time och fn:current-dateTime, stöds inte.

  • Den implicita tidszonen är fast till UTC+0 och kan inte ändras.

  • Funktionen fn:doc() stöds inte. Alla frågor utförs mot xml-typkolumner eller variabler.

  • Funktionen fn:collection() stöds inte.