Generare elementi di pari livello tramite query nidificate in modalità AUTOGenerate Siblings with a Nested AUTO Mode Query

Nell'esempio seguente viene descritta la procedura per generare elementi di pari livello tramite una query nidificata in modalità AUTO.The following example shows how to generate siblings by using a nested AUTO mode query. L'unico metodo alternativo per generare un valore XML di questo tipo è utilizzare la modalità EXPLICIT,The only other way to generate such XML is to use the EXPLICIT mode. ma ciò può rivelarsi eccessivamente complesso.However, this can be cumbersome.

EsempioExample

Questa query costruisce un valore XML che contiene informazioni sugli ordini di vendita,This query constructs XML that provides sales order information. Sono inclusi gli elementi seguenti:This includes the following:

  • Informazioni contenute nell'intestazione degli ordini di vendita, SalesOrderID, SalesPersonIDe OrderDate.Sales order header information, SalesOrderID, SalesPersonID, and OrderDate. AdventureWorks2012AdventureWorks2012 archivia queste informazioni nella tabella SalesOrderHeader . stores this information in the SalesOrderHeader table.

  • Informazioni dettagliate sugli ordini di vendita,Sales order detail information. che includono i prodotti ordinati, il prezzo unitario e la quantità ordinata.This includes one or more products ordered, the unit price, and the quantity ordered. Tali informazioni sono archiviate nella tabella SalesOrderDetail .This information is stored in the SalesOrderDetail table.

  • Informazioni sul venditore,Sales person information. ovvero la persona che ha ricevuto l'ordine.This is the salesperson who took the order. Il codice SalesPerson è archiviato nella tabella SalesPersonID.The SalesPerson table provides the SalesPersonID. Per questa query è necessario unire in join tale tabella con la tabella Employee , per trovare il nome del venditore.For this query, you have to join this table to the Employee table to find the name of the sales person.

    Le due query SELECT che seguono generano valori XML con struttura lievemente diversa.The two distinct SELECT queries that follow generate XML with a small difference in shape.

    La prima query genera un valore XML in cui <SalesPerson> e <SalesOrderHeader> sono elementi di pari livello figli di <SalesOrder>:The first query generates XML in which <SalesPerson> and <SalesOrderHeader> appear as sibling children of <SalesOrder>:

SELECT   
      (SELECT top 2 SalesOrderID, SalesPersonID, CustomerID,  
         (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice  
           from Sales.SalesOrderDetail  
            WHERE  SalesOrderDetail.SalesOrderID =   
                   SalesOrderHeader.SalesOrderID  
            FOR XML AUTO, TYPE)  
        FROM  Sales.SalesOrderHeader  
        WHERE SalesOrderHeader.SalesOrderID = SalesOrder.SalesOrderID  
        for xml auto, type),  
        (SELECT *   
         FROM  (SELECT SalesPersonID, EmployeeID  
              FROM Sales.SalesPerson, HumanResources.Employee  
              WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As   
                     SalesPerson  
         WHERE  SalesPerson.SalesPersonID = SalesOrder.SalesPersonID  
       FOR XML AUTO, TYPE)  
FROM (SELECT SalesOrderHeader.SalesOrderID, SalesOrderHeader.SalesPersonID  
      FROM Sales.SalesOrderHeader, Sales.SalesPerson  
      WHERE SalesOrderHeader.SalesPersonID = SalesPerson.SalesPersonID  
     ) as SalesOrder  
ORDER BY SalesOrder.SalesOrderID  
FOR XML AUTO, TYPE  

Nella query precedente l'istruzione SELECT più esterna esegue le operazioni seguenti:In the previous query, the outermost SELECT statement does the following:

  • Esegue una query sul set di righe SalesOrder, specificato nella clausola FROM.Queries the rowset, SalesOrder, specified in the FROM clause. Viene restituito un valore XML con uno o più elementi <SalesOrder>.The result is an XML with one or more <SalesOrder> elements.

  • Specifica la modalità AUTO e la direttiva TYPE .Specifies AUTO mode and the TYPE directive. AUTO trasforma il risultato della query in XML e la direttiva TYPE restituisce il risultato come tipo xml .AUTO mode transforms the query result into XML, and the TYPE directive returns the result as xml type.

  • Include due istruzioni SELECT nidificate, separate da una virgola (,).Includes two nested SELECT statements separated by a comma. La prima istruzione nidificata SELECT recupera le informazioni relative all'ordine di vendita, l'intestazione ed i dettagli, mentre la seconda istruzione SELECT recupera le informazioni relative al venditore.The first nested SELECT retrieves sales order information, header and details, and the second nested SELECT statement retrieves salesperson information.

    • L'istruzione SELECT che recupera SalesOrderID, SalesPersonIDe CustomerID include a sua volta un'altra istruzione nidificata SELECT ... FOR XML (con modalità AUTO e direttiva TYPE ), che restituisce i dettagli dell'ordine di vendita.The SELECT statement that retrieves SalesOrderID, SalesPersonID, and CustomerID itself includes another nested SELECT ... FOR XML statement (with AUTO mode and TYPE directive) that returns sales order detail information.

    L'istruzione SELECT che recupera le informazioni relative al venditore esegue una query sul set di righe SalesPerson, creato nella clausola FROM .The SELECT statement that retrieves the sales person information queries a rowset, SalesPerson, created in the FROM clause. Per consentire l'esecuzione delle query FOR XML , è necessario specificare un nome per il set di righe anonimo generato nella clausola FROM .For FOR XML queries to work, you must provide a name for the anonymous rowset generated in the FROM clause. In tal caso viene specificato il nome SalesPerson.In this case, the name provided is SalesPerson.

    Risultato parziale:This is the partial result:

<SalesOrder>  
  <Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">  
    <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />  
    <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />  
    <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />  
  </Sales.SalesOrderHeader>  
  <SalesPerson SalesPersonID="279" EmployeeID="279" />  
</SalesOrder>  
...  

La query seguente genera le stesse informazioni relative all'ordine di vendita, con la differenza che nel valore XML risultante <SalesPerson> appare un elemento di pari livello di <SalesOrderDetail>:The following query generates the same sales order information, except that in the resulting XML, the <SalesPerson> appears as a sibling of <SalesOrderDetail>:

<SalesOrder>  
    <SalesOrderHeader ...>  
          <SalesOrderDetail .../>  
          <SalesOrderDetail .../>  
          ...  
          <SalesPerson .../>  
    </SalesOrderHeader>  

</SalesOrder>  
<SalesOrder>  
  ...  
</SalesOrder>  

Query:This is the query:

SELECT SalesOrderID, SalesPersonID, CustomerID,  
             (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice  
              from Sales.SalesOrderDetail  
              WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID  
              FOR XML AUTO, TYPE),  
              (SELECT *   
               FROM  (SELECT SalesPersonID, EmployeeID  
                    FROM Sales.SalesPerson, HumanResources.Employee  
                    WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson  
               WHERE  SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID  
         FOR XML AUTO, TYPE)  
FROM Sales.SalesOrderHeader  
WHERE SalesOrderID=43659 or SalesOrderID=43660  
FOR XML AUTO, TYPE  

Risultato:This is the result:

<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">  
  <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />  
  <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />  
  <Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />  
  <SalesPerson SalesPersonID="279" EmployeeID="279" />  
</Sales.SalesOrderHeader>  
<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="117">  
  <Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />  
  <Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />  
  <SalesPerson SalesPersonID="279" EmployeeID="279" />  
</Sales.SalesOrderHeader>  

Poiché la direttiva TYPE restituisce il risultato della query come tipo xml , è possibile eseguire una query sul valore XML risultante usando vari metodi con tipo di dati xml .Because the TYPE directive returns a query result as xml type, you can query the resulting XML by using various xml data type methods. Per altre informazioni, vedere Metodi con tipo di dati XML.For more information, see xml Data Type Methods. In questa query di esempio, si noti quanto segue:In the following query, note the following:

  • La query precedente viene aggiunta nella clausola FROM .The previous query is added in the FROM clause. Il risultato della query viene restituito sotto forma di tabella.The query result is returned as a table. Viene aggiunto l'alias XmlCol .Note the XmlCol alias that is added.

  • La clausola SELECT specifica una query XQuery sul valore XmlCol restituito nella clausola FROM .The SELECT clause specifies an XQuery against the XmlCol returned in the FROM clause. Per specificare l'espressione XQuery viene usato il metodo query() del tipo di dati xml.The query() method of the xml data type is used in specifying the XQuery. Per altre informazioni, vedere Metodo query() con (tipo di dati XML).For more information, see query() Method (xml Data Type).

    SELECT XmlCol.query('<Root> { /* } </Root>')  
    FROM (  
    SELECT SalesOrderID, SalesPersonID, CustomerID,  
                 (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice  
                  from Sales.SalesOrderDetail  
                  WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID  
                  FOR XML AUTO, TYPE),  
                  (SELECT *   
                   FROM  (SELECT SalesPersonID, EmployeeID  
                        FROM Sales.SalesPerson, HumanResources.Employee  
                        WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson  
                   WHERE  SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID  
             FOR XML AUTO, TYPE)  
    FROM Sales.SalesOrderHeader  
    WHERE SalesOrderID='43659' or SalesOrderID='43660'  
    FOR XML AUTO, TYPE ) as T(XmlCol)  
    

Vedere ancheSee Also

Utilizzo di query FOR XML nidificateUse Nested FOR XML Queries