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

Come descritto in FOR XML (SQL Server), la modalità AUTO restituisce i risultati della query come elementi XML annidati.As described in FOR XML (SQL Server), AUTO mode returns query results as nested XML elements. ma non consente di controllare in modo preciso la struttura del valore XML generato.This does not provide much control over the shape of the XML generated from a query result. È consigliabile utilizzare query in modalità AUTO solo se si desidera generare gerarchie semplici.The AUTO mode queries are useful if you want to generate simple hierarchies. Tuttavia, l' uso della modalità EXPLICIT con FOR XML e l' uso della modalità PATH con FOR XML assicurano maggiore controllo e flessibilità nella definizione della forma di elementi XML dal risultato di una query.However, Use EXPLICIT Mode with FOR XML and Use PATH Mode with FOR XML provide more control and flexibility in deciding the shape of the XML from a query result.

Ogni tabella nella clausola FROM, della quale almeno una colonna viene elencata nella clausola SELECT, viene rappresentata come un elemento XML.Each table in the FROM clause, from which at least one column is listed in the SELECT clause, is represented as an XML element. Se per la clausola FOR XML è specificata l'opzione facoltativa ELEMENTS, verrà eseguito il mapping delle colonne elencate nella clausola SELECT ad attributi o sottoelementi.The columns listed in the SELECT clause are mapped to attributes or subelements, if the optional ELEMENTS option is specified in the FOR XML clause.

La gerarchia XML (nidificazione degli elementi) del valore XML risultante è basata sull'ordine delle tabelle identificate dalle colonne specificate nella clausola SELECT.The XML hierarchy, nesting of the elements, in the resulting XML is based on the order of tables identified by the columns specified in the SELECT clause. L'ordine in cui sono specificati i nomi delle colonne nella clausola SELECT è pertanto significativo.Therefore, the order in which column names are specified in the SELECT clause is significant. La prima tabella da sinistra identificata costituisce l'elemento di livello principale nel documento XML risultante.The first, leftmost table that is identified forms the top element in the resulting XML document. La seconda tabella da sinistra, identificata dalle colonne nell'istruzione SELECT, costituisce un sottoelemento all'interno dell'elemento di livello principale e così via.The second leftmost table, identified by columns in the SELECT statement, forms a subelement within the top element, and so on.

Se un nome di colonna elencato nella clausola SELECT appartiene a una tabella già identificata da una colonna specificata in precedenza nella clausola SELECT, tale colonna verrà aggiunta come attributo dell'elemento già creato, anziché aggiungere un nuovo livello alla gerarchia.If a column name listed in the SELECT clause is from a table that is already identified by a previously specified column in the SELECT clause, the column is added as an attribute of the element already created, instead of opening a new level of hierarchy. Se si specifica l'opzione ELEMENTS, la colonna verrà aggiunta come attributo.If the ELEMENTS option is specified, the column is added as an attribute.

Si esegua ad esempio la query seguente:For example, execute this query:

SELECT Cust.CustomerID,   
       OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       OrderHeader.Status,  
       Cust.CustomerType  
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader  
WHERE Cust.CustomerID = OrderHeader.CustomerID  
ORDER BY Cust.CustomerID  
FOR XML AUTO  

Risultato parziale:This is the partial result:

<Cust CustomerID="1" CustomerType="S">  
  <OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" />  
  <OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" />  
  <OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" />  
  <OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" />  
</Cust>  
...  

Nella clausola SELECT si noti quanto segue:Note the following in the SELECT clause:

  • CustomerID fa riferimento alla tabella Cust.The CustomerID references the Cust table. Verrà pertanto creato un elemento <Cust> al quale verrà aggiunto CustomerID come attributo.Therefore, a <Cust> element is created and CustomerID is added as its attribute.

  • Poiché inoltre le tre colonne OrderHeader.CustomerID, OrderHeader.SaleOrderID e OrderHeader.Status fanno riferimento alla tabella OrderHeader,Next, three columns, OrderHeader.CustomerID, OrderHeader.SaleOrderID, and OrderHeader.Status, reference the OrderHeader table. viene aggiunto un elemento <OrderHeader> come sottoelemento dell'elemento <Cust> e le tre colonne vengono aggiunte come attributi di <OrderHeader>.Therefore, an <OrderHeader> element is added as a subelement of the <Cust> element and the three columns are added as attributes of <OrderHeader>.

  • Anche la colonna Cust.CustomerType fa riferimento alla tabella Cust, che era già stata identificata dalla colonna Cust.CustomerID.Next, the Cust.CustomerType column again references the Cust table that was already identified by the Cust.CustomerID column. Non verranno pertanto creati nuovi elementi,Therefore, no new element is created. ma all'elemento <Cust> creato in precedenza verrà aggiunto l'attributo CustomerType.Instead, the CustomerType attribute is added to the <Cust> element that was previously created.

  • Nella query sono specificati alias per i nomi delle tabelle.The query specifies aliases for the table names. Tali alias sono i nomi degli elementi corrispondenti.These aliases appear as corresponding element names.

  • La clausola ORDER BY è necessaria per raggruppare tutti gli elementi figlio sotto un unico elemento padre.ORDER BY is required to group all children under one parent.

    Questa query è simile alla precedente, con la differenza che nella clausola SELECT le colonne della tabella OrderHeader sono specificate prima di quelle della tabella Cust.This query is similar to the previous one, except the SELECT clause specifies columns in the OrderHeader table before the columns in the Cust table. Viene pertanto creato prima l'elemento <OrderHeader>, a cui viene aggiunto l'elemento figlio <Cust>.Therefore, first <OrderHeader> element is created and then the <Cust> child element is added to it.

select OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       OrderHeader.Status,  
       Cust.CustomerID,   
       Cust.CustomerType  
from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader  
where Cust.CustomerID = OrderHeader.CustomerID  
for xml auto  

Risultato parziale:This is the partial result:

<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">  
  <Cust CustomerID="1" CustomerType="S" />  
</OrderHeader>  
...  

Se alla clausola FOR XML viene aggiunta l'opzione ELEMENTS, verrà restituito un valore XML incentrato sugli elementi.If the ELEMENTS option is added in the FOR XML clause, element-centric XML is returned.

SELECT Cust.CustomerID,   
       OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       OrderHeader.Status,  
       Cust.CustomerType  
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader  
WHERE Cust.CustomerID = OrderHeader.CustomerID  
ORDER BY Cust.CustomerID  
FOR XML AUTO, ELEMENTS  

Risultato parziale:This is the partial result:

<Cust>  
  <CustomerID>1</CustomerID>  
  <CustomerType>S</CustomerType>  
  <OrderHeader>  
    <CustomerID>1</CustomerID>  
    <SalesOrderID>43860</SalesOrderID>  
    <Status>5</Status>  
  </OrderHeader>  
   ...  
</Cust>  
...  

In questa query, durante la creazione degli elementi <Cust>, i valori CustomerID di ogni riga vengono confrontati con quelli della riga successiva perché CustomerID è la chiave primaria della tabella.In this query, the CustomerID values are compared from one row to the next in creating the <Cust> elements, because CustomerID is the primary key of the table. Se CustomerID non viene identificata come chiave primaria della tabella, tutti i valori delle colonne (in questa query, CustomerID e CustomerType) di ogni riga verranno confrontati con quelli della riga successiva.If CustomerID is not identified as the primary key for the table, all the column values (CustomerID, CustomerType in this query) are compared from one row to the next. Se i valori sono diversi, al valore XML verrà aggiunto un nuovo elemento <Cust>.If the values differ, a new <Cust> element is added to the XML.

Durante il confronto di questi valori di colonna, se una qualsiasi delle colonne da confrontare è di tipo text, ntext, imageo xml, FOR XML presupporrà che i valori siano diversi e non eseguirà il confronto, anche se potrebbero essere uguali.When comparing these column values, if any of the columns to be compared are of type text, ntext, image, or xml, FOR XML assumes that the values are different and not compared, even though they may be the same. Questo avviene perché il confronto di oggetti di grandi dimensioni non è supportato.This is because comparing large objects is not supported. Vengono aggiunti elementi al risultato per ogni riga selezionata.Elements are added to the result for each row selected. Si noti che le colonne di tipo (n)varchar(max) e varbinary(max) vengono confrontate.Note that columns of (n)varchar(max) and varbinary(max) are compared.

Quando una colonna nella clausola SELECT non può essere associata a una qualsiasi delle tabelle identificate nella clausola FROM, ad esempio nel caso di una colonna aggregata o calcolata, la colonna viene aggiunta al documento XML al livello di nidificazione più basso quando viene rilevata nell'elenco.When a column in the SELECT clause cannot be associated with any of the tables identified in the FROM clause, as in the case of an aggregate column or computed column, the column is added in the XML document in the deepest nesting level in place when it is encountered in the list. Se tale colonna viene elencata per prima nella clausola SELECT, verrà aggiunta come elemento di livello principale.If such a column appears as the first column in the SELECT clause, the column is added to the top element.

Se nella clausola SELECT è specificato il carattere jolly asterisco (), il livello di nidificazione verrà determinato come descritto in precedenza, ovvero in base all'ordine in cui le righe vengono restituite dal motore query.If the asterisk () wildcard character is specified in the SELECT clause, the nesting is determined in the same way as previously described, based on the order that the rows are returned by the query engine.

Argomenti della sezioneIn This Section

Per ulteriori informazioni sulla modalità AUTO, vedere gli argomenti seguenti:The following topics provide more information about AUTO mode:

Vedere ancheSee Also

SELECT (Transact-SQL) SELECT (Transact-SQL)
FOR XML (SQL Server) FOR XML (SQL Server)