Utilizzo della modalità EXPLICIT con FOR XMLUse EXPLICIT Mode with FOR XML

Come illustrato nell'argomento Costruzione di codice XML tramite la clausola FOR XML, le modalità RAW e AUTO forniscono scarso controllo sulla forma del codice XML generato dai risultati della query.As described in the topic, Constructing XML Using FOR XML, RAW and AUTO mode do not provide much control over the shape of the XML generated from a query result. La modalità EXPLICIT tuttavia offre maggiore flessibilità nella generazione del codice XML desiderato dal risultato di una query.However, EXPLICIT mode provides the most flexibility in generating the XML you want from a query result.

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.The EXPLICIT mode query must be written in a specific way so that the additional information about the required XML, such as expected nesting in the XML, is explicitly specified as part of the query. In base al codice XML desiderato, la formulazione di query in modalità EXPLICIT può essere un'operazione complessa.Depending on the XML you request, writing EXPLICIT mode queries can be cumbersome. L' uso della modalità PATH con annidamento è un'alternativa più semplice alla scrittura di query in modalità EXPLICIT.You may find that Using PATH Mode with nesting is a simpler alternative to writing EXPLICIT mode queries.

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.Because you describe the XML you want as part of the query in EXPLICIT mode, you must ensure that the generated XML is well formed and valid.

Elaborazione dei set di righe in modalità EXPLICITRowset Processing in EXPLICIT Mode

La modalità EXPLICIT converte il set di righe risultante dall'esecuzione della query in un documento XML.The EXPLICIT mode transforms the rowset that results from the query execution into an XML document. Affinché la modalità EXPLICIT generi il documento XML, è necessario che il set di righe abbia un formato specifico.In order for EXPLICIT mode to produce the XML document, the rowset must have a specific format. 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.This requires that you write the SELECT query to produce the rowset, the universal table, with a specific format so the processing logic can then produce the XML you want.

Innanzitutto, la query deve produrre le due colonne di metadati seguenti:First, the query must produce the following two metadata columns:

  • La prima colonna deve contenere il numero di tag e il tipo Integer dell'elemento corrente. Il nome della colonna deve essere Tag.The first column must provide the tag number, integer type, of the current element, and the column name must be Tag. La query deve fornire un numero di tag univoco per ogni elemento che verrà creato dal set di righe.Your query must provide a unique tag number for each element that will be constructed from the rowset.

  • La seconda colonna deve contenere il numero di tag dell'elemento padre. Il nome della colonna deve essere Parent.The second column must provide a tag number of the parent element, and this column name must be Parent. In questo modo, le colonne Tag e Parent forniscono informazioni di gerarchia.In this way, the Tag and the Parent column provide hierarchy information.

    I valori di queste colonne di metadati, con le informazioni contenute nei nomi di colonna, vengono utilizzati per produrre il codice XML desiderato.These metadata column values, together with the information in the column names, are used to produce the XML you want. Si noti che nella query è necessario fornire i nomi delle colonne in modo specifico.Note that your query must provide column names in a specific way. Si noti anche che un valore 0 o NULL nella colonna Parent indica che l'elemento corrispondente non ha un elemento padre.Also note that a 0 or NULL in the Parent column indicates that the corresponding element has no parent. L'elemento viene aggiunto al codice XML come elemento di livello principale.The element is added to the XML as a top-level element.

    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:To understand how the universal table generated by a query is processed into generating XML result, assume that you have written a query that produces this universal table:

    Tabella universale di esempioSample universal table

    Dalla tabella universale si noti quanto segue:Note the following about this universal table:

  • Le prime due colonne sono Tag e Parent e sono colonne di metadati.The first two columns are Tag and Parent and are meta columns. Questi valori determinano la gerarchia.These values determine the hierarchy.

  • I nomi delle colonne sono formulati in un modo specifico, descritto di seguito in questo argomento.The column names are specified in a certain way, as described later in this topic.

  • Durante la generazione del codice XML da questa tabella universale, i dati della tabella vengono partizionati verticalmente in gruppi di colonne.In generating the XML from this universal table, the data in this table is partitioned vertically into column groups. Il raggruppamento viene determinato in base al valore di Tag e ai nomi delle colonne.The grouping is determined based on the Tag value and the column names. Nella generazione del codice XML, la logica di elaborazione seleziona un gruppo di colonne per riga e costruisce un elemento.In constructing XML, the processing logic selects one group of columns for each row and constructs an element. In questo esempio avviene quanto segue:The following applies in this example:

    • 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.For Tag column value 1 in the first row, the columns whose names include the same tag number, Customer!1!cid and Customer!1!name, form a group. Queste colonne vengono utilizzate per l'elaborazione della riga e si può notare che la forma dell'elemento generato è <Customer id=... name=...>.These columns are used in processing the row, and you may have noticed that the shape of the generated element is <Customer id=... name=...>. Il formato del nome di colonna è descritto di seguito in questo argomento.Column name format is described later in this topic.

    • Per le righe con valore 2 nella colonna Tag, le colonne Order!2!id e Order!2!date formano un gruppo che viene quindi usato per la costruzione di elementi, <Order id=... date=... />.For rows with Tag column value 2, columns Order!2!id and Order!2!date form a group that is then used in constructing elements, <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.For rows with Tag column value 3, columns OrderDetail!3!id!id and OrderDetail!3!pid!idref form a group. Ognuna di queste righe genera un elemento <OrderDetail id=... pid=...> da queste colonne.Each of these rows generates an element, <OrderDetail id=... pid=...>, from these columns.

  • Si noti che nella generazione della gerarchia XML le righe vengono elaborate in ordine.Note that in generating XML hierarchy, the rows are processed in order. La gerarchia XML viene determinata come descritto di seguito:The XML hierarchy is determined as shown in the following:

    • La prima riga specifica il valore 1 di Tag e il valore NULL di Parent.The first row specifies Tag value 1 and Parent value NULL. L'elemento corrispondente, <Customer>, viene pertanto aggiunto nel codice XML come elemento di livello principale.Therefore, the corresponding element, <Customer> element, is added as a top-level element in the XML.

      <Customer cid="C1" name="Janine">  
      
    • La seconda riga identifica il valore 2 di Tag e il valore 1 di Parent.The second row identifies Tag value 2 and Parent value 1. L'elemento <Order> viene pertanto aggiunto come elemento figlio dell'elemento <Customer>.Therefore, the element, <Order> element, is added as a child of the <Customer> element.

      <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.The next two rows identify Tag value 3 and Parent value 2. I due elementi <OrderDetail> vengono pertanto aggiunti come elementi figlio dell'elemento <Order>.Therefore, the two elements, <OrderDetail> elements, are added as children of the <Order> element.

      <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.The last row identifies 2 as the Tag number and 1 as the Parent tag number. Un altro elemento figlio <Order> viene pertanto aggiunto all'elemento padre <Customer>.Therefore, another <Order> element child is added to the <Customer> parent element.

      <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 usati i valori presenti nelle colonne di metadati Tag e Parent, le informazioni specificate nei nomi delle colonne e l'ordinamento corretto delle righe.To summarize, the values in the Tag and Parent meta columns, the information provided in the column names, and the correct ordering of the rows produce the XML you want when you use EXPLICIT mode.

Ordinamento delle righe della tabella universaleUniversal Table Row Ordering

Nella generazione del codice XML, le righe della tabella universale vengono elaborate in ordine.In constructing the XML, the rows in the universal table are processed in order. 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.Therefore, to retrieve the correct children instances associated with their parent, the rows in the rowset must be ordered so that each parent node is immediately followed by its children.

Specifica dei nomi delle colonne in una tabella universaleSpecifying Column Names in a Universal Table

Quando si scrivono query in modalità EXPLICIT è necessario specificare i nomi delle colonne nel set di righe risultante utilizzando il formato specificato di seguito.When writing EXPLICIT mode queries, column names in the resulting rowset must be specified by using this format. I nomi delle colonne forniscono informazioni di trasformazione, fra cui nomi di elementi e attributi e altre informazioni, specificate utilizzando direttive.They provide transformation information including element and attribute names and other additional information, specified by using directives.

Il formato generale è il seguente:This is the general format:


ElementName!TagNumber!AttributeName!Directive  

Di seguito è fornita la descrizione delle parti del formato.Following is the description of the parts of the format.

ElementNameElementName
Identificatore generico risultante dell'elemento.Is the resulting generic identifier of the element. Ad esempio, se Customers viene specificato come ElementName, verrà generato l'elemento <Customers>.For example, if Customers is specified as ElementName, the <Customers> element is generated.

TagNumberTagNumber
È un valore di tag univoco assegnato a un elemento.Is a unique tag value assigned to an element. Questo valore, insieme alle due colonne di metadati Tag e Parent, determina l'annidamento degli elementi nel codice XML risultante.This value, with the help of the two metadata columns, Tag and Parent, determines the nesting of the elements in the resulting XML.

AttributeNameAttributeName
Indica il nome dell'attributo da costruire nell'argomento ElementNamespecificato.Provides the name of the attribute to construct in the specified ElementName. Ciò si verifica quando Directive non viene specificato.This is the behavior if Directive is not specified.

Se per Directive viene specificato xml, cdataoppure element, questo valore viene usato per costruire un elemento figlio di ElementName, al quale viene aggiunto il valore della colonna.If Directive is specified and it is xml, cdata, or element, this value is used to construct an element child of ElementName, and the column value is added to it.

Se si specifica Directive, AttributeName può essere vuoto.If you specify the Directive, the AttributeName can be empty. Ad esempio, ElementName!TagNumber!!Directive.For example, ElementName!TagNumber!!Directive. In questo caso, il valore della colonna è direttamente contenuto da ElementName.In this case, the column value is directly contained by the ElementName.

DirectiveDirective
Directive è facoltativo e può essere usato per specificare altre informazioni per la generazione del codice XML. Directive is optional and you can use it to provide additional information for construction of the XML. Directive svolge due funzioni.Directive has two purposes.

Il primo è la codifica dei valori come ID, IDREF e IDREFS.One of the purposes is to encode values as ID, IDREF, and IDREFS. È possibile specificare le parole chiave ID, IDREFe IDREFS come valori di Directive.You can specify ID, IDREF, and IDREFS keywords as Directives. Queste direttive sovrascrivono i tipi di attributo,These directives overwrite the attribute types. consentendo di creare collegamenti tra più documenti.This allows you to create intra-document links.

È anche possibile usare Directive per definire il mapping tra i dati di tipo stringa e il codice XML.Also, you can use Directive to indicate how to map the string data to XML. Le parole chiave hide, element, elementxsinil, xml, xmltexte cdata possono essere usate come valori di Directive.The hide, element, elementxsinil, xml, xmltext, and cdata keywords can be used as the Directive. La direttiva hide nasconde il nodo.The hide directive hides the node. È utile quando si recuperano i valori solo a scopo di ordinamento, ma non si desidera che vengano inseriti nel codice XML risultante.This is useful when you retrieve values only for sorting purposes, but you do not want them in the resulting XML.

La direttiva element genera un elemento contenuto anziché un attributo.The element directive generates a contained element instead of an attribute. I dati contenuti vengono codificati come entità.The contained data is encoded as an entity. Ad esempio, il carattere < viene convertito in <.For example, the < character becomes <. Per i valori di colonna NULL non vengono generati elementi.For NULL column values, no element is generated. Se si vuole che venga generato un elemento anche per i valori di colonna NULL è possibile specificare la direttiva elementxsinil .If you want an element generated for null column values, you can specify the elementxsinil directive. Verrà generato un elemento con attributo xsi:nil=TRUE.This will generate an element that has the attribute xsi:nil=TRUE.

La direttiva xml equivale a una direttiva element , ma non viene eseguita alcuna codifica di entità.The xml directive is the same as an element directive, except that no entity encoding occurs. Si noti che è possibile combinare la direttiva element con ID, IDREFo IDREFS, mentre la direttiva xml può essere usata solo con hide.Note that the element directive can be combined with ID, IDREF, or IDREFS, whereas the xml directive is not allowed with any other directive, except hide.

La direttiva cdata contiene i dati inserendoli in una sezione CDATA.The cdata directive contains the data by wrapping it with a CDATA section. Il contenuto non viene codificato come entità.The content is not entity encoded. I dati originali devono essere di tipo testo, ad esempio varchar, nvarchar, texto ntext.The original data type must be a text type such as varchar, nvarchar, text, or ntext. Questa direttiva può essere usa solo con hide.This directive can be used only with hide. Se si usa questa direttiva, non è necessario specificare AttributeName .When this directive is used, AttributeName must not be specified.

Nella maggior parte dei casi è consentito combinare le direttive tra questi due gruppi, ma non è possibile combinarle tra loro.Combining directives between these two groups is allowed in most cases, but combining them among themselves is not allowed.

Se Directive e AttributeName non vengono specificati, ad esempio, Customer!1, è implicita una direttiva element , ad esempio Customer!1!!elemente i dati di colonna sono contenuti in ElementName.If the Directive and the AttributeName is not specified, for example, Customer!1, an element directive is implied, such as Customer!1!!element, and column data is contained in the 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.If the xmltext directive is specified, the column content is wrapped in a single tag that is integrated with the rest of the document. Questa direttiva risulta utile nel recupero dei dati XML di overflow (non utilizzati) archiviati in una colonna tramite OPENXML.This directive is useful in fetching overflow, unconsumed, XML data stored in a column by OPENXML. Per altre informazioni, vedere OPENXML (SQL Server).For more information, see OPENXML (SQL Server).

Se si specifica AttributeName il nome del tag viene sostituito dal nome specificato.If AttributeName is specified, the tag name is replaced by the specified name. 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à.Otherwise, the attribute is appended to the current list of attributes of the enclosing elements by putting the content at the beginning of the containment without entity encoding. La colonna con questa direttiva deve essere di tipo testo, ad esempio varchar, nvarchar, char, nchar, texto ntext.The column with this directive must be a text type, such as varchar, nvarchar, char, nchar, text, or ntext. Questa direttiva può essere usa solo con hide.This directive can be used only with hide. Risulta particolarmente utile per il recupero dei dati di overflow archiviati in una colonna.This directive is useful in fetching overflow data stored in a column. Se il contenuto non è in un formato XML corretto, il funzionamento non è prevedibile.If the content is not a well-formed XML, the behavior is undefined.

Argomenti della sezioneIn This Section

Negli esempi seguenti viene illustrato l'utilizzo della modalità EXPLICIT.The following examples illustrate the use of EXPLICIT mode.

Vedere ancheSee Also

Usare la modalità RAW con FOR XML Use RAW Mode with FOR XML
Utilizzo della modalità AUTO con FOR XML Use AUTO Mode with FOR XML
Utilizzare la modalità PATH con FOR XML Use PATH Mode with FOR XML
SELECT (Transact-SQL) SELECT (Transact-SQL)
FOR XML (SQL Server) FOR XML (SQL Server)