Contesto delle espressioni e valutazione delle query (XQuery)

Si applica a:SQL Server

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: questa è la fase di compilazione delle query. A seconda delle informazioni disponibili, durante l'analisi statica della query a volte vengono generati errori.

  • Contesto dinamico: questa è la 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:

  • I criteri di spazio vuoto limite sono impostati su strip. Pertanto, lo spazio vuoto limite non viene mantenuto dagli eventuali costruttori di elementi e attributi 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 altre informazioni, vedere Aggiungere spazi dei nomi alle query con 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. Nella query seguente, ad esempio, WITH XMLNAMESPACES dichiara un prefisso (pd) che lo associa allo spazio dei nomi (https://someURI). Nella clausola WHERE, tuttavia, il prologo della query ha la priorità su tale associazione.

      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  
      

    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 della raccolta di XML Schema associati alla colonna o alla variabile vengono importati nel contesto statico. Per altre informazioni, vedere Confrontare dati XML tipizzati con dati XML non tipizzati.

  • Per ogni tipo atomico presente negli schemi importati, nel contesto statico viene inoltre resa disponibile una funzione di cast, Questo è illustrato nell'esempio seguente. In questo esempio viene specificata una query su una variabile xml tipizzata. La raccolta di XML Schema associata alla variabile definisce un tipo atomico, myType. Corrispondente a questo tipo, una funzione di cast, myType(), è disponibile durante l'analisi statica. 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 la funzione di cast per il tipo XML predefinito int viene specificata nell'espressione.

    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 di tipo primitivo numerico:

    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 altre 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. Si tratta dell'impostazione predefinita. Di conseguenza, il tipo del nodo elemento costruito è di tipo xdt:untyped e gli attributi sono di tipo xdt:untypedAtomic .

  • È supportata solo la modalità ordinata.

  • Sono supportati solo i criteri di rimozione dello spazio XML.

  • La funzionalità URI di base non è supportata.

  • fn:doc() non è supportato.

  • fn:collection() non è supportato.

  • 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 sottoposti a override dal metodo nodes().

    • Il tipo di dati xml imposta l'elemento di contesto, il nodo da elaborare, sul nodo documento.

    • 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 di data e ora correnti, fn:current-date, fn:current-time e fn:current-dateTime, non sono supportate.

  • Il fuso orario implicito è fisso su 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.

Vedi anche

Nozioni fondamentali su XQuery
Confrontare dati XML tipizzati con dati XML non tipizzati
Raccolte di XML Schema (SQL Server)