Determinazione della struttura dei valori XML tramite query nidificate FOR XML.Shape XML with Nested FOR XML Queries

Nell'esempio seguente viene eseguita una query sulla tabella Production.Product per recuperare i valori di ListPrice e StandardCost di un prodotto specifico.The following example queries the Production.Product table to retrieve the ListPrice and StandardCost values of a specific product. Per rendere la query più interessante, entrambi i prezzi vengono restituiti in un elemento <Price> e ogni elemento <Price> include un attributo PriceType.To make the query interesting, both prices are returned in a <Price> element, and each <Price> element has a PriceType attribute.

EsempioExample

La struttura prevista del valore XML è la seguente:This is the expected shape of the XML:

<xsd:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet2" elementFormDefault="qualified">  
  <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />  
  <xsd:element name="Production.Product" type="xsd:anyType" />  
</xsd:schema>  
<Production.Product xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2" ProductID="520">  
  <Price xmlns="" PriceType="ListPrice">133.34</Price>  
  <Price xmlns="" PriceType="StandardCost">98.77</Price>  
</Production.Product>  

La query FOR XML nidificata è la seguente:This is the nested FOR XML query:

USE AdventureWorks2012;  
GO  
SELECT Product.ProductID,   
          (SELECT 'ListPrice' as PriceType,   
                   CAST(CAST(ListPrice as NVARCHAR(40)) as XML)   
           FROM    Production.Product Price   
           WHERE   Price.ProductID=Product.ProductID   
           FOR XML AUTO, TYPE),  
          (SELECT  'StandardCost' as PriceType,   
                   CAST(CAST(StandardCost as NVARCHAR(40)) as XML)   
           FROM    Production.Product Price   
           WHERE   Price.ProductID=Product.ProductID   
           FOR XML AUTO, TYPE)  
FROM Production.Product  
WHERE ProductID=520  
for XML AUTO, TYPE, XMLSCHEMA  

Dalla query precedente si noti quanto segue:Note the following from the previous query:

  • L'istruzione SELECT esterna costruisce l'elemento <Product>, che ha un attributo ProductID e due elementi <Price> figlio.The outer SELECT statement constructs the <Product> element that has a ProductID attribute and two <Price> child elements.

  • Le due istruzioni SELECT interne costruiscono due elementi <Price>, ognuno con un attributo PriceType e un valore XML che restituisce il prezzo del prodotto.The two inner SELECT statements construct two <Price> elements, each with a PriceType attribute and XML that returns the product price.

  • La direttiva XMLSCHEMA nell'istruzione SELECT più esterna genera lo schema XSD inline che descrive la struttura del valore XML risultante.The XMLSCHEMA directive in the outer SELECT statement generates the inline XSD schema that describes the shape of the resulting XML.

    Per rendere la query più interessante, è possibile creare la query FOR XML e quindi creare una query XQuery sul risultato in modo da modificare la struttura del valore XML, come illustrato nella query seguente:To make the query interesting, you can write the FOR XML query and then write an XQuery against the result to reshape the XML, as shown in the following query:

SELECT ProductID,   
 ( SELECT p2.ListPrice, p2.StandardCost  
   FROM Production.Product p2   
   WHERE Product.ProductID = p2.ProductID  
   FOR XML AUTO, ELEMENTS XSINIL, type ).query('  
                                   for $p in /p2/*  
                                   return   
                                    <Price PriceType = "{local-name($p)}">  
                                     { data($p) }  
                                    </Price>  
                                  ')  
FROM Production.Product  
WHERE ProductID = 520  
FOR XML AUTO, TYPE  

L'esempio precedente usa il metodo query() con tipo di dati xml per eseguire una query sul valore XML restituito dalla query FOR XML interna e costruire il risultato previsto.The previous example uses the query() method of the xml data type to query the XML returned by the inner FOR XML query and construct the expected result.

Risultato:This is the result:

<Production.Product ProductID="520">  
  <Price PriceType="ListPrice">133.3400</Price>  
  <Price PriceType="StandardCost">98.7700</Price>  
</Production.Product>  

Vedere ancheSee Also

Utilizzo di query FOR XML nidificateUse Nested FOR XML Queries