Esempi di utilizzo della modalità AUTOExamples: Using AUTO Mode

Negli esempi seguenti viene illustrato l'utilizzo della modalità AUTO.The following examples illustrate the use of AUTO mode. Molte di queste query vengono eseguite sui documenti XML con istruzioni per la produzione di biciclette, archiviati nella colonna Instructions della tabella ProductModel del database di esempio AdventureWorks2012AdventureWorks2012 .Many of these queries are specified against bicycle manufacturing instructions XML documents that are stored in the Instructions column of the ProductModel table in the AdventureWorks2012AdventureWorks2012 sample database.

Esempio: recupero di informazioni sul cliente, l'ordine e i dettagli dell'ordineExample: Retrieving customer, order, and order detail information

Questa query recupera informazioni sul cliente, sull'ordine e sui dettagli dell'ordine per un cliente specifico.This query retrieves customer, order, and order detail information for a specific customer.

USE AdventureWorks2012;  
GO  
SELECT Cust.CustomerID,   
       OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       Detail.SalesOrderID, Detail.LineTotal, Detail.ProductID,   
       Product.Name,  
       Detail.OrderQty  
FROM Sales.Customer AS Cust  
INNER JOIN Sales.SalesOrderHeader AS OrderHeader   
    ON Cust.CustomerID = OrderHeader.CustomerID  
INNER JOIN Sales.SalesOrderDetail AS Detail  
    ON OrderHeader.SalesOrderID = Detail.SalesOrderID  
INNER JOIN Production.Product AS Product  
    ON Product.ProductID = Detail.ProductID  
WHERE Cust.CustomerID IN (29672, 29734)  
ORDER BY OrderHeader.CustomerID,  
         OrderHeader.SalesOrderID  
FOR XML AUTO;  

Poiché la query identifica gli alias di tabella Cust, OrderHeader, Detaile Product , la modalità AUTO genera gli elementi corrispondenti.Because the query identifies, Cust, OrderHeader, Detail, and Product table aliases, corresponding elements are generated by the AUTO mode. Anche in questo caso, la gerarchia di tali elementi è determinata dall'ordine in cui le tabelle vengono identificate dalle colonne specificate nella clausola SELECT .Again, the order in which tables are identified by the columns specified in the SELECT clause determine the hierarchy of these elements.

Di seguito è riportato il risultato parziale.This is the partial result.

<Cust CustomerID="29672">

<OrderHeader CustomerID="29672" SalesOrderID="43660">

<Detail SalesOrderID="43660" LineTotal="874.794000" ProductID="758" OrderQty="1">

<Product Name="Road-450 Red, 52" />

</Detail>

<Detail SalesOrderID="43660" LineTotal="419.458900" ProductID="762" OrderQty="1">

<Product Name="Road-650 Red, 44" />

</Detail>

</OrderHeader>

<OrderHeader CustomerID="29672" SalesOrderID="47660">

<Detail SalesOrderID="47660" LineTotal="469.794000" ProductID="765" OrderQty="1">

<Product Name="Road-650 Black, 58" />

</Detail>

</OrderHeader>

<OrderHeader CustomerID="29672" SalesOrderID="49857">

<Detail SalesOrderID="49857" LineTotal="44.994000" ProductID="852" OrderQty="1">

<Product Name="Women's Tights, S" />

</Detail>

</OrderHeader>

...

</Cust>

Esempio: specifica della clausola GROUP BY e di funzioni di aggregazioneExample: Specifying GROUP BY and aggregate functions

La query seguente restituisce gli ID di singoli clienti e il numero degli ordini effettuati da tali clienti.The following query returns individual customer IDs and the number of orders that the customer has requested.

USE AdventureWorks2012;  
GO  
SELECT C.CustomerID, COUNT(*) AS NoOfOrders  
FROM Sales.Customer AS C  
INNER JOIN Sales.SalesOrderHeader AS SOH  
On C.CustomerID = SOH.CustomerID  
GROUP BY C.CustomerID  
FOR XML AUTO;This is the partial result:  

<I CustomerID="11000" NoOfOrders="3" />

<I CustomerID="11001" NoOfOrders="3" />

...

Esempio: specifica di colonne calcolate in modalità AUTOExample: Specifying computed columns in AUTO mode

Questa query restituisce i nomi concatenati dei singoli clienti e le informazioni sugli ordini.This query returns concatenated individual customer names and the order information. Poiché la colonna calcolata viene assegnata al livello più interno rilevato fino a quel punto, che in questo esempio è l'elemento <SOH>,Because the computed column is assigned to the innermost level encountered at that point, the <SOH> element in this example. nel risultato i nomi concatenati dei clienti vengono aggiunti come attributi dell'elemento <SOH>.The concatenated customer names are added as attributes of the <SOH> element in the result.

USE AdventureWorks2012;  
GO  
SELECT P.FirstName + ' ' + P.LastName AS Name,  
       SOH.SalesOrderID  
FROM Sales.Customer AS C  
INNER JOIN Sales.SalesOrderHeader AS SOH  
    ON  C.CustomerID = SOH.CustomerID  
INNER JOIN Person.Person AS P  
    ON P.BusinessEntityID = C.PersonID  
FOR XML AUTO;  

Risultato parziale:This is the partial result:

<SOH Name="Jon Yang" SalesOrderID="43793" />  
<SOH Name="Eugene Huang" SalesOrderID="43767" />  

Per recuperare gli elementi <IndividualCustomer> che hanno come sottoelemento un attributo Name contenente le informazioni di intestazione di ogni ordine di vendita, la query viene riscritta utilizzando un'istruzione sub-SELECT.To retrieve the <IndividualCustomer> elements having the Name attribute that contains each sales order header information as a subelement, the query is rewritten using a sub select. L'istruzione SELECT interna crea una tabella IndividualCustomer temporanea con la colonna calcolata contenente i nomi dei singoli clienti.The inner select creates a temporary IndividualCustomer table with the computed column that contains the names of the individual customers. Tale tabella viene quindi unita in join alla tabella SalesOrderHeader per ottenere il risultato.This table is then joined to the SalesOrderHeader table to obtain the result.

Nella tabella Sales.Customer sono archiviate informazioni sui singoli clienti, incluso il valore PersonID di ogni cliente.Note that the Sales.Customer table stores individual customer information, including the PersonID value for that customer. Tale valore PersonID viene quindi utilizzato per recuperare il nome del contatto dalla tabella Person.Person .This PersonID is then used to find the contact name from the Person.Person table.

SELECT IndividualCustomer.Name, SOH.SalesOrderID  
FROM (SELECT FirstName+ ' '+LastName AS Name, C.PersonID, C.CustomerID  
      FROM Sales.Customer AS C, Person.Person AS P  
      WHERE C.PersonID = P.BusinessEntityID) AS IndividualCustomer  
LEFT OUTER JOIN  Sales.SalesOrderHeader AS SOH  
   ON IndividualCustomer.CustomerID = SOH.CustomerID  
ORDER BY IndividualCustomer.CustomerID, SOH.CustomerIDFOR XML AUTO;  

Risultato parziale:This is the partial result:

<IndividualCustomer Name="Jon Yang">

<SOH SalesOrderID="43793" />

<SOH SalesOrderID="51522" />

<SOH SalesOrderID="57418" />

</IndividualCustomer>

...

...

Esempio: recupero di dati binariExample: Returning binary data

Questa query restituisce una foto del prodotto dalla tabella ProductPhoto .This query returns a product photo from the ProductPhoto table. ThumbNailPhoto è una colonna varbinary(max) nella tabella ProductPhoto .ThumbNailPhoto is an varbinary(max) column in the ProductPhoto table. Per impostazione predefinita, la modalità AUTO restituisce ai dati binari un riferimento costituito da un URL relativo alla radice virtuale del database in cui viene eseguita la query.By default, AUTO mode returns to the binary data a reference that is a relative URL to the virtual root of the database where the query is executed. Per identificare l'immagine, è necessario specificare l'attributo chiave ProductPhotoID .The ProductPhotoID key attribute must be specified to identify the image. Per recuperare un riferimento a un'immagine come illustrato nell'esempio seguente, è inoltre necessario specificare la chiave primaria della tabella nella clausola SELECT , per identificare una riga in modo univoco.In retrieving an image reference as illustrated in this example, the primary key of the table must also be specified in the SELECT clause to uniquely identify a row.

SELECT ProductPhotoID, ThumbNailPhoto  
FROM   Production.ProductPhoto   
WHERE ProductPhotoID=70  
FOR XML AUTO;  

Risultato:This is the result:

-- result

<Production.ProductPhoto

ProductPhotoID="70"

ThumbNailPhoto= "dbobject/Production.ProductPhoto[@ProductPhotoID='70']/@ThumbNailPhoto" />

Se si esegue la stessa query specificando l'opzione BINARY BASE64 ,The same query is executed with the BINARY BASE64 option. i dati binari verranno restituiti in formato con codifica Base64.The query returns the binary data in base64-encoded format.

SELECT ProductPhotoID, ThumbNailPhoto  
FROM   Production.ProductPhoto   
WHERE ProductPhotoID=70  
FOR XML AUTO, BINARY BASE64;  

Risultato:This is the result:

-- result

<Production.ProductPhoto ProductPhotoID="70" ThumbNailPhoto="Base64 encoded photo" />

Per impostazione predefinita, quando si utilizza la modalità AUTO per recuperare dati binari, al posto dei dati binari viene restituito un riferimento a un URL relativo alla radice virtuale del database in cui è stata eseguita la query.By default, when you use AUTO mode to retrieve binary data, a reference to a relative URL to the virtual root of the database where the query was executed will be returned instead of the binary data. Questa situazione si presenta se non è specificata l'opzione BINARY BASE64.This will occur if the BINARY BASE64 option is not specified.

Quando la modalità AUTO restituisce un riferimento URL a dati binari in database senza distinzione tra maiuscole e minuscole, in cui un nome di tabella o colonna specificato nella query non corrisponde al nome della tabella o della colonna nel database, la query viene eseguita,When AUTO mode returns a URL reference to the binary data in case-insensitive databases where a table or column name specified in the query does not match the table or column name in the database, the query executes. ma la combinazione di maiuscole e minuscole nel riferimento non sarà consistente.However, the case returned in the reference will not be consistent. Esempio:For example:

SELECT ProductPhotoID, ThumbnailPhoto  
FROM   Production.ProductPhoto   
WHERE  ProductPhotoID=70  
FOR XML AUTO;  

Risultato:This is the result:

<Production.PRODUCTPHOTO

PRODUCTPHOTOID="70"

THUMBNAILPHOTO= "dbobject/Production.PRODUCTPHOTO[@ProductPhotoID='70']/@ThumbNailPhoto" />

Questo costituisce un problema soprattutto quando si eseguono query dbobject su un database con distinzione tra maiuscole e minuscole.This can be a problem particularly when dbobject queries are executed against a case sensitive database. Per evitarlo, è necessario che la combinazione di maiuscole e minuscole nel nome di tabella o colonna specificato nelle query corrisponda a quella del nome della tabella o colonna nel database.To avoid this, the case of the table or column name that is specified in the queries should match the case of the table or column name in the database.

Esempio: informazioni sulla codificaExample: Understanding the encoding

In questo esempio vengono illustrate le varie operazioni di codifica eseguite sul risultato.This example shows the various encoding that occurs in the result.

Creare la tabella seguente:Create this table:

CREATE TABLE [Special Chars] (Col1 char(1) primary key, [Col#&2] varbinary(50));  

Aggiungere i dati seguenti alla tabella:Add the following data to the table:

INSERT INTO [Special Chars] VALUES ('&', 0x20), ('#', 0x20);  

La query restituisce i dati dalla tabella.This query returns the data from the table. È specificata la modalità AUTO della clausola FOR XML.The FOR XML AUTO mode is specified. I dati binari vengono restituiti come riferimento.Binary data is returned as a reference.

SELECT * FROM [Special Chars] FOR XML AUTO;  

Risultato:This is the result:

<Special_x0020_Chars

Col1="#"

Col_x0023__x0026_2="dbobject/Special_x0020_Chars[@Col1='#']/@Col_x0023__x0026_2"

/>

<Special_x0020_Chars

Col1="&"

Col_x0023__x0026_2="dbobject/Special_x0020_Chars[@Col1='&']/@Col_x0023__x0026_2"

/>

Di seguito viene descritto il processo di codifica dei caratteri speciali nel risultato:This is the process for encoding special characters in the result:

  • I caratteri speciali XML e URL inclusi nei nomi degli elementi e degli attributi restituiti nel risultato della query vengono codificati utilizzando il valore esadecimale del carattere Unicode corrispondente.In the query result, the special XML and URL characters in the element and attribute names that are returned are encoded by using the hexadecimal value of the corresponding Unicode character. Nell'esempio precedente il nome di elemento <Special Chars> viene restituito come <Special_x0020_Chars>.In the previous result, the element name <Special Chars> is returned as <Special_x0020_Chars>. Il nome di attributo <Col#&2> viene restituito come <Col_x0023__x0026_2>.The attribute name <Col#&2> is returned as <Col_x0023__x0026_2>. Vengono codificati sia i caratteri XML speciali che i caratteri URL speciali.Both XML and URL special characters are encoded.

  • Se i valori degli elementi o degli attributi includono una delle cinque entità carattere XML standard (', "", <, > e &), tali caratteri XML speciali verranno sempre codificati tramite la codifica dei caratteri XML.If the values of the elements or attribute contain any of the five standard XML character entities (', "", <, >, and &), these special XML characters are always encoded using XML character encoding. Nel risultato precedente il valore & nel valore dell'attributo <Col1> viene codificato come &.In the previous result, the value & in the value of attribute <Col1> is encoded as &. Il carattere #, tuttavia, rimane invariato perché è un carattere XML valido e non un carattere XML speciale.However, the # character remains #, because it is a valid XML character and not a special XML character.

  • Se i valori degli elementi o degli attributi contengono eventuali caratteri URL speciali che hanno un significato particolare negli URL, tali caratteri verranno codificati solo nel valore URL DBOBJECT e unicamente se il carattere speciale fa parte del nome di una tabella o di una colonna.If the values of the elements or attributes contain any special URL characters that have special meaning in the URL, they are encoded only in the DBOBJECT URL value and are encoded only when the special character is part of a table or column name. Nel risultato carattere # , che fa parte del nome di tabella Col#&2 , viene codificato come _x0023_ in the DBOJBECT URL.In the result, the character # that is part of table name Col#&2 is encoded as _x0023_ in the DBOJBECT URL.

Vedere ancheSee Also

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