Delen via


Expressiecontext en queryevaluatie (XQuery)

van toepassing op:SQL Server-

De context van een expressie is de informatie die wordt gebruikt om deze te analyseren en te evalueren. Hier volgen de twee fasen waarin XQuery wordt geëvalueerd:

  • statische context: dit is de fase voor het compileren van query's. Op basis van de beschikbare informatie worden er soms fouten gegenereerd tijdens deze statische analyse van de query.

  • dynamische context: dit is de uitvoeringsfase van de query. Zelfs als een query geen statische fouten bevat, zoals fouten tijdens het compileren van query's, kan de query fouten retourneren tijdens de uitvoering.

Statische context

Initialisatie van statische context verwijst naar het proces van het samenstellen van alle informatie voor statische analyse van de expressie. Als onderdeel van de initialisatie van statische context is het volgende voltooid:

  • Het beleid grens witruimte is ingesteld op strip. Daarom blijft de witruimte van de grens niet behouden door de elementen en kenmerk constructors in de query. Bijvoorbeeld:

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

    Deze query retourneert het volgende resultaat, omdat de grensruimte wordt verwijderd tijdens het parseren van de XQuery-expressie:

    <a>Hello</a><b>Hello2</b>  
    
  • Het voorvoegsel en de naamruimtebinding worden geïnitialiseerd voor het volgende:

    • Een set vooraf gedefinieerde naamruimten.

    • Alle naamruimten die zijn gedefinieerd met BEHULP van XMLNAMESPACES. Zie Naamruimten toevoegen aan query's met WITH XMLNAMESPACES) voor meer informatie.

    • Alle naamruimten die zijn gedefinieerd in het query-prolog. Houd er rekening mee dat de naamruimtedeclaraties in het prolog de naamruimtedeclaratie in de WITH XMLNAMESPACES kunnen overschrijven. In de volgende query declareert WITH XMLNAMESPACES bijvoorbeeld een voorvoegsel (pd) dat deze verbindt met naamruimte (https://someURI). In de WHERE-component overschrijft de query prolog de binding echter.

      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  
      

    Al deze naamruimtebindingen worden omgezet tijdens de initialisatie van statische context.

  • Als u een query uitvoert op een getypte XML- kolom of variabele, worden de onderdelen van de XML-schemaverzameling die aan de kolom of variabele is gekoppeld, geïmporteerd in de statische context. Zie Typed XML vergelijken met niet-getypte XML-voor meer informatie.

  • Voor elk atomisch type in de geïmporteerde schema's wordt ook een cast-functie beschikbaar gesteld in de statische context. Dit wordt geïllustreerd in het volgende voorbeeld. In dit voorbeeld wordt een query opgegeven op basis van een getypte xml- variabele. De XML-schemaverzameling die aan deze variabele is gekoppeld, definieert een atomisch type, myType. Bij dit type is een cast-functie, myType(), beschikbaar tijdens de statische analyse. De query-expressie (ns:myType(0)) retourneert een waarde van 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)')  
    

    In het volgende voorbeeld wordt de cast-functie voor de int ingebouwd XML-type opgegeven in de expressie.

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

Nadat de statische context is geïnitialiseerd, wordt de query-expressie geanalyseerd (gecompileerd). De statische analyse omvat het volgende:

  1. Queryparsering.

  2. De functie omzetten en namen typen die zijn opgegeven in de expressie.

  3. Statisch typen van de query. Dit zorgt ervoor dat de query veilig is. De volgende query retourneert bijvoorbeeld een statische fout, omdat voor de operator + numerieke primitieve typeargumenten zijn vereist:

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

    In het volgende voorbeeld is voor de operator value() een singleton vereist. Zoals opgegeven in het XML-schema, kunnen er meerdere <Elem> elementen zijn. Statische analyse van de expressie bepaalt dat deze niet veilig is en dat er een statische fout wordt geretourneerd. Als u de fout wilt oplossen, moet de expressie opnieuw worden geschreven om expliciet een singleton (data(/x:Elem)[1]) op te geven.

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

    Zie XQuery- en statische typenvoor meer informatie.

Implementatiebeperkingen

Hier volgen de beperkingen met betrekking tot statische context:

  • De XPath-compatibiliteitsmodus wordt niet ondersteund.

  • Voor XML-constructie wordt alleen de stripconstructiemodus ondersteund. Dit is de standaardinstelling. Daarom is het type van het constructed elementknooppunt van xdt:untyped type en de kenmerken van xdt:untypedAtomic type.

  • Alleen geordende bestelmodus wordt ondersteund.

  • Alleen beleid voor strip-XML-ruimte wordt ondersteund.

  • De basis-URI-functionaliteit wordt niet ondersteund.

  • fn:doc() wordt niet ondersteund.

  • fn:collection() wordt niet ondersteund.

  • XQuery static flagger is niet opgegeven.

  • De sortering die is gekoppeld aan het xml- gegevenstype wordt gebruikt. Deze sortering is altijd ingesteld op de Unicode-codepuntsortering.

Dynamische context

Dynamische context verwijst naar de informatie die beschikbaar moet zijn op het moment dat de expressie wordt uitgevoerd. Naast de statische context wordt de volgende informatie geïnitialiseerd als onderdeel van dynamische context:

  • De expressiefocus, zoals het contextitem, de contextpositie en de contextgrootte, wordt geïnitialiseerd, zoals wordt weergegeven in het volgende. Houd er rekening mee dat al deze waarden kunnen worden overschreven door de methode nodes().

    • Met het xml- gegevenstype wordt het contextitem, het knooppunt dat wordt verwerkt, ingesteld op het documentknooppunt.

    • De contextpositie, de positie van het contextitem ten opzichte van de knooppunten die worden verwerkt, wordt eerst ingesteld op 1.

    • De contextgrootte, het aantal items in de volgorde dat wordt verwerkt, wordt eerst ingesteld op 1, omdat er altijd één documentknooppunt is.

Implementatiebeperkingen

Hier volgen de beperkingen met betrekking tot dynamische context:

  • De huidige datum- en tijdfuncties contextfuncties, :current-date, fn:current-timeen fn:current-dateTime, worden niet ondersteund.

  • De impliciete tijdzone- is vastgezet op UTC+0 en kan niet worden gewijzigd.

  • De functie fn:doc() wordt niet ondersteund. Alle query's worden uitgevoerd op basis van xml- typekolommen of variabelen.

  • De functie fn:collection() wordt niet ondersteund.

Zie ook

XQuery Basics
type XML vergelijken met niet-getypte XML-
XML-schemaverzamelingen (SQL Server)