Condividi tramite


Contesto delle espressioni e valutazione delle query (XQuery)

Il contesto di un'espressione è rappresentato dalle informazioni che ne consentono l'analisi e la valutazione. Di seguito sono illustrate le due fasi della valutazione di XQuery:

  • Contesto statico – Si tratta della fase di compilazione della query. A seconda delle informazioni disponibili, durante l'analisi statica della query a volte vengono generati errori.

  • Contesto dinamico – Si tratta della fase di esecuzione della query. Anche se in una query non si verificano errori statici, ad esempio durante la compilazione, è possibile che vengano generati errori durante l'esecuzione della query.

Contesto statico

L'inizializzazione del contesto statico prevede la raccolta di tutte le informazioni necessarie per l'analisi statica dell'espressione. Nella fase di inizializzazione vengono eseguite le operazioni seguenti:

  • Il criterio relativo agli spazi vuoti limite viene impostato sulla rimozione. Gli spazi vuoti limite non vengono pertanto mantenuti dai costruttori any element e attribute nella query. Ad esempio:

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

    Questa query restituisce il risultato seguente, perché lo spazio limite viene escluso durante l'analisi dell'espressione XQuery:

    <a>Hello</a><b>Hello2</b>
    
  • Il prefisso e l'associazione allo spazio dei nomi vengono inizializzati per gli elementi seguenti:

    • Un set di spazi dei nomi predefiniti.

    • Gli spazi dei nomi definiti utilizzando WITH XMLNAMESPACES. Per ulteriori informazioni, vedere Aggiunta di spazi dei nomi tramite WITH XMLNAMESPACES).

    • Gli spazi dei nomi definiti nel prologo della query. Si noti che le dichiarazioni degli spazi dei nomi nel prologo possono avere la priorità sulla dichiarazione dello spazio dei nomi di WITH XMLNAMESPACES. Ad esempio, nella query seguente, in WITH XMLNAMESPACES viene dichiarato un prefisso (pd) che definisce un'associazione a uno spazio dei nomi (http://someURI). Nella clausola WHERE, tuttavia, il prologo della query ha la priorità su tale associazione.

      WITH XMLNAMESPACES ('http://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
      

    Tutte le associazioni di spazi dei nomi vengono risolte durante l'inizializzazione del contesto statico.

  • Se si esegue una query su una colonna o una variabile xml tipizzata, i componenti dell'insieme di schemi XML associato alla colonna o alla variabile vengono importati nel contesto statico. Per ulteriori informazioni, vedere Dati XML tipizzati confrontati con dati XML non tipizzati.

  • Per ogni tipo atomico presente negli schemi importati, nel contesto statico viene inoltre resa disponibile una funzione di cast, come illustrato nell'esempio seguente. Nell'esempio, una query viene eseguita su una variabile xml tipizzata. L'insieme di schemi XML associato alla variabile definisce un tipo atomico, myType. Durante l'analisi statica è disponibile una funzione di cast, myType(), corrispondente a questo tipo. L'espressione della query (ns:myType(0)) restituisce un valore di tipo 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)')
    

    Nell'esempio seguente, l'espressione specifica la funzione di cast per il tipo XML predefinito int.

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

Dopo che il contesto statico è stato inizializzato, viene analizzata (compilata) l'espressione della query. L'analisi statica include le operazioni seguenti:

  1. Analisi della query.

  2. Risoluzione dei nomi della funzione e del tipo specificati nell'espressione.

  3. Tipizzazione statica della query, che consente di verificare che la query sia indipendente dai tipi. Ad esempio, la query seguente restituisce un errore statico perché l'operatore + richiede argomenti numerici di tipo primitivo:

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

    Nell'esempio seguente, l'operatore value() richiede un singleton. Come specificato nello schema XML, possono essere presenti più elementi <Elem>. L'analisi statica dell'espressione determina che non è indipendente dai tipi e viene restituito un errore statico. Per risolvere l'errore, è necessario riformulare l'espressione in modo da specificare in modo esplicito un singleton (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)')
    

    Per ulteriori informazioni, vedere XQuery e tipizzazione statica.

Limitazioni di implementazione

Di seguito sono elencate le limitazioni correlate al contesto statico:

  • La modalità di compatibilità XPath non è supportata.

  • Per la costruzione del codice XML, è supportata solo la modalità di costruzione con rimozione. Questa è l'impostazione predefinita. Il nodo elemento costruito è pertanto di tipo xdt:untyped e gli attributi sono di tipo xdt:untypedAtomic.

  • È supportata solo la modalità ordinata.

  • È supportato solo il criterio di rimozione dello spazio XML.

  • La funzionalità URI di base non è supportata.

  • fn:doc() non è supportata.

  • fn:collection() non è supportata.

  • Il flagger statico XQuery non è disponibile.

  • Vengono utilizzate le regole di confronto associate al tipo di dati xml. Vengono sempre impostate le regole di confronto dei punti di codice Unicode.

Contesto dinamico

Il contesto dinamico indica le informazioni che devono essere disponibili durante l'esecuzione dell'espressione. Oltre al contesto statico, le informazioni seguenti vengono inizializzate come parte del contesto dinamico:

  • L'elemento di contesto, la posizione del contesto e le dimensioni del contesto vengono inizializzate come illustrato di seguito. Si noti che tutti questi valori possono essere modificati tramite il metodo nodes().

    • Il tipo di dati xml imposta il nodo documento come elemento di contesto, ovvero come nodo da elaborare.

    • La posizione del contesto, ovvero la posizione dell'elemento di contesto rispetto ai nodi da elaborare, viene innanzitutto impostata su 1.

    • Le dimensioni del contesto, ovvero il numero di elementi della sequenza da elaborare, vengono innanzitutto impostate su 1, perché esiste sempre un nodo del documento.

Limitazioni di implementazione

Di seguito sono elencate le limitazioni correlate al contesto dinamico:

  • Le funzioni di contesto relative a data e ora, fn:current-date, fn:current-time e fn:current-dateTime, non sono supportate.

  • Il fuso orario implicito è per impostazione predefinita UTC+0 e non può essere modificato.

  • La funzione fn:doc() non è supportata. Tutte le query vengono eseguite su colonne o variabili di tipo xml.

  • La funzione fn:collection() non è supportata.