Condividi tramite


Utilizzo della modalità EXPLICIT

Come illustrato nell'argomento relativo alla creazione di XML utilizzando FOR XML, le modalità RAW e AUTO forniscono scarso controllo sulla forma del codice XML generato dai risultati della query. La modalità EXPLICIT tuttavia offre maggiore flessibilità nella generazione del codice XML desiderato dal risultato di una query.

La query in modalità EXPLICIT deve essere formulata in modo tale che le informazioni aggiuntive relative al codice XML, ad esempio la nidificazione desiderata vengano specificate in modo esplicito nell'ambito della query stessa. In base al codice XML desiderato, la formulazione di query in modalità EXPLICIT può essere un'operazione complessa. L'utilizzo della modalità PATH con nidificazione è un'alternativa più semplice alla scrittura di query in modalità EXPLICIT.

Poiché in modalità EXPLICIT si descrive il codice XML desiderato nell'ambito della query, è necessario assicurarsi che il codice XML generato sia in formato corretto e valido.

Elaborazione dei set di righe in modalità EXPLICIT

La modalità EXPLICIT converte il set di righe risultante dall'esecuzione della query in un documento XML. Affinché la modalità EXPLICIT generi il documento XML, è necessario che il set di righe abbia un formato specifico. A questo scopo è necessario formulare la query SELECT in modo tale che restituisca il set di righe, la tabella universale, con un formato specifico in modo che la logica di elaborazione possa creare il codice XML desiderato.

Innanzitutto, la query deve produrre le due colonne di metadati seguenti:

  • La prima colonna deve contenere il numero di tag e il tipo Integer dell'elemento corrente. Il nome della colonna deve essere Tag. La query deve fornire un numero di tag univoco per ogni elemento che verrà creato dal set di righe.

  • La seconda colonna deve contenere il numero di tag dell'elemento padre. Il nome della colonna deve essere Parent. In questo modo, le colonne Tag e Parent forniscono informazioni di gerarchia.

I valori di queste colonne di metadati, con le informazioni contenute nei nomi di colonna, vengono utilizzati per produrre il codice XML desiderato. Si noti che nella query è necessario fornire i nomi delle colonne in modo specifico. Si noti inoltre che un valore 0 o NULL nella colonna Parent indica che l'elemento corrispondente non ha un elemento padre. L'elemento viene aggiunto al codice XML come elemento di livello principale.

Per comprendere il modo in cui la tabella universale generata da una query viene elaborata per generare il codice XML risultante, si supponga di aver creato una query che produce la tabella universale seguente:

Tabella universale di esempio

Dalla tabella universale si noti quanto segue:

  • Le prime due colonne sono Tag e Parent e sono colonne di metadati. Questi valori determinano la gerarchia.

  • I nomi delle colonne sono formulati in un modo specifico, descritto di seguito in questo argomento.

  • Durante la generazione del codice XML da questa tabella universale, i dati della tabella vengono partizionati verticalmente in gruppi di colonne. Il raggruppamento viene determinato in base al valore di Tag e ai nomi delle colonne. Nella generazione del codice XML, la logica di elaborazione seleziona un gruppo di colonne per riga e costruisce un elemento. In questo esempio avviene quanto segue:

    • Per il valore 1 della colonna Tag nella prima riga, le colonne i cui nomi includono lo stesso numero di tag, Customer!1!cid e Customer!1!name, formano un gruppo. Queste colonne vengono utilizzate per l'elaborazione della riga e si può notare che la forma dell'elemento generato è <Customer id=... name=...>. Il formato del nome di colonna è descritto di seguito in questo argomento.

    • Per le righe con valore 2 nella colonna Tag, le colonne Order!2!id e Order!2!date formano un gruppo che viene quindi utilizzato per la costruzione di elementi, <Order id=... date=... />.

    • Per le righe con valore 3 nella colonna Tag, le colonne OrderDetail!3!id!id e OrderDetail!3!pid!idref formano un gruppo. Ognuna di queste righe genera un elemento <OrderDetail id=... pid=...> da queste colonne.

  • Si noti che nella generazione della gerarchia XML le righe vengono elaborate in ordine. La gerarchia XML viene determinata come descritto di seguito:

    • La prima riga specifica il valore 1 di Tag e il valore NULL di Parent. L'elemento corrispondente, <Customer>, viene pertanto aggiunto nel codice XML come elemento di livello principale.

      <Customer cid="C1" name="Janine">
      
    • La seconda riga identifica il valore 2 di Tag e il valore 1 di Parent. L'elemento <Order> viene pertanto aggiunto come elemento figlio dell'elemento <Customer>.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
      
    • Le due righe successive identificano il valore 3 di Tag e il valore 2 di Parent. I due elementi <OrderDetail> vengono pertanto aggiunti come elementi figlio dell'elemento <Order>.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
      
    • L'ultima riga identifica 2 come valore di Tag e 1 come valore di Parent. Un altro elemento figlio <Order> viene pertanto aggiunto all'elemento padre <Customer>.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
         </Order>
         <Order id="O2" date="3/29/1997">
      </Customer>
      

Per riassumere, per generare il codice XML desiderato in modalità EXPLICIT vengono utilizzati i valori presenti nelle colonne di metadati Tag e Parent, le informazioni specificate nei nomi delle colonne e l'ordinamento corretto delle righe.

Ordinamento delle righe della tabella universale

Nella generazione del codice XML, le righe della tabella universale vengono elaborate in ordine. Per recuperare le istanze figlio corrette associate al rispettivo elemento padre, è pertanto necessario che le righe del set vengano ordinate in modo tale che il nodo dell'elemento padre sia seguito immediatamente dagli elementi figlio.

Specifica dei nomi delle colonne in una tabella universale

Quando si scrivono query in modalità EXPLICIT è necessario specificare i nomi delle colonne nel set di righe risultante utilizzando il formato specificato di seguito. I nomi delle colonne forniscono informazioni di trasformazione, fra cui nomi di elementi e attributi e altre informazioni, specificate utilizzando direttive.

Il formato generale è il seguente:

ElementName!TagNumber!AttributeName!Directive

Di seguito è fornita la descrizione delle parti del formato.

  • ElementName
    Identificatore generico risultante dell'elemento. Ad esempio, se Customers viene specificato come ElementName, verrà generato l'elemento <Customers>.

  • TagNumber
    È un valore di tag univoco assegnato a un elemento. Questo valore, insieme alle due colonne di metadati Tag e Parent, determina la nidificazione degli elementi nel codice XML risultante.

  • AttributeName
    Fornisce il nome dell'attributo da costruire nell'argomento ElementName specificato. Ciò si verifica quando Directive non viene specificato.

    Se per Directive viene specificato xml, cdata oppure element, questo valore viene utilizzato per costruire un elemento figlio di ElementName, al quale viene aggiunto il valore della colonna.

    Se si specifica Directive, AttributeName può essere vuoto. Ad esempio, ElementName!TagNumber!!Directive. In questo caso, il valore della colonna è direttamente contenuto da ElementName.

  • Directive
    Directive è opzionale e può essere utilizzato per fornire informazioni aggiuntive per la generazione del codice XML. Directive svolge due funzioni.

    Il primo è la codifica dei valori come ID, IDREF e IDREFS. È possibile specificare le parole chiave ID, IDREFe IDREFS come direttive. Queste direttive sovrascrivono i tipi di attributo, consentendo di creare collegamenti tra più documenti.

    È inoltre possibile utilizzare Directive per definire il mapping tra i dati di tipo stringa e il codice XML. Le parole chiave hide, element, elementxsinil, xml, xmltext e cdata possono essere utilizzate come direttiva. La direttiva hide nasconde il nodo. È utile quando si recuperano i valori solo a scopo di ordinamento, ma non si desidera che vengano inseriti nel codice XML risultante.

    La direttiva element genera un elemento contenuto anziché un attributo. I dati contenuti vengono codificati come entità. Ad esempio, il carattere < viene convertito in &lt;. Per i valori di colonna NULL non vengono generati elementi. Se si desidera che venga generato un elemento anche per i valori di colonna NULL è possibile specificare la direttiva elementxsinil. Verrà generato un elemento con attributo xsi:nil=TRUE.

    La direttiva xml equivale a una direttiva element, ma non viene eseguita alcuna codifica di entità. Si noti che è possibile combinare la direttiva element con ID, IDREF o IDREFS, mentre la direttiva xml può essere utilizzata solo con hide.

    La direttiva cdata contiene i dati inserendoli in una sezione CDATA. Il contenuto non viene codificato come entità. I dati originali devono essere di tipo testo, ad esempio varchar, nvarchar, text o ntext. Questa direttiva può essere utilizzata solo con hide. Se si utilizza questa direttiva, non è necessario specificare AttributeName.

    Nella maggior parte dei casi è consentito combinare le direttive tra questi due gruppi, ma non è possibile combinarle tra loro.

    Se Directive e AttributeName non vengono specificati, ad esempio, Customer!1, è implicita una direttiva element, ad esempio Customer!1!!element e i dati di colonna sono contenuti in ElementName.

    Se si specifica la direttiva xmltext il contenuto della colonna viene inserito in un unico tag che viene integrato con il resto del documento. Questa direttiva risulta utile nel recupero dei dati XML di overflow (non utilizzati) archiviati in una colonna tramite OPENXML. Per ulteriori informazioni, vedere Esecuzione di query su codice XML tramite OPENXML.

    Se si specifica AttributeName il nome del tag viene sostituito dal nome specificato. In caso contrario, l'attributo viene aggiunto all'elenco corrente di attributi degli elementi che lo racchiudono inserendo il contenuto all'inizio dell'oggetto di contenimento senza codifica di entità. La colonna con questa direttiva deve essere di tipo testo, ad esempio varchar, nvarchar, char, nchar, text o ntext. Questa direttiva può essere utilizzata solo con hide. Risulta particolarmente utile per il recupero dei dati di overflow archiviati in una colonna. Se il contenuto non è in un formato XML corretto, il funzionamento non è prevedibile.