Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Negli esempi seguenti viene illustrato l'uso della modalità AUTO. Molte di queste query vengono specificate nei documenti XML delle istruzioni per la produzione di biciclette archiviati nella colonna Istruzioni della tabella ProductModel nel database di esempio AdventureWorks2012.
Esempio: Recupero di informazioni sul cliente, sull'ordine e sui dettagli dell'ordine
Questa query recupera informazioni sul cliente, sull'ordine e sui dettagli dell'ordine per un cliente specifico.
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 Cust, OrderHeader, Detail e Product come alias di tabella, gli elementi corrispondenti vengono generati dalla modalità AUTO. Anche in questo caso, l'ordine in cui le tabelle sono identificate dalle colonne specificate nella SELECT clausola determinano la gerarchia di questi elementi.
Di seguito è riportato il risultato parziale.
<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 delle funzioni GROUP BY e di aggregazione
La query seguente restituisce i singoli ID cliente e il numero di ordini richiesti dal cliente.
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 delle colonne calcolate in modalità AUTO
Questa query restituisce i nomi dei singoli clienti concatenati e le informazioni sull'ordine. Poiché la colonna calcolata viene assegnata al livello più interno rilevato a quel punto, cioè l'elemento <SOH> in questo esempio. I nomi dei clienti concatenati vengono aggiunti come attributi dell'elemento <SOH> nel risultato.
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:
<SOH Name="Jon Yang" SalesOrderID="43793" />
<SOH Name="Eugene Huang" SalesOrderID="43767" />
Per recuperare gli <IndividualCustomer> elementi con l'attributo che contiene ogni informazione di intestazione dell'ordine Name di vendita come sottoelemento, la query viene riscritta usando una selezione secondaria. La selezione interna crea una tabella temporanea IndividualCustomer con la colonna calcolata che contiene i nomi dei singoli clienti. Questa tabella viene quindi unita alla SalesOrderHeader tabella per ottenere il risultato.
Si noti che la Sales.Customer tabella archivia le informazioni dei singoli clienti, incluso il PersonID valore per il cliente.
PersonID viene quindi usato per trovare il nome del contatto nella tabella Person.Person.
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:
<IndividualCustomer Name="Jon Yang">
<SOH SalesOrderID="43793" />
<SOH SalesOrderID="51522" />
<SOH SalesOrderID="57418" />
</IndividualCustomer>
...
...
Esempio: Restituzione di dati binari
Questa query restituisce una foto del prodotto dalla ProductPhoto tabella.
ThumbNailPhoto è una varbinary(max) colonna nella ProductPhoto tabella. Per impostazione predefinita, la modalità AUTO restituisce ai dati binari un riferimento che è un URL relativo alla radice virtuale del database dove viene eseguita la query. L'attributo ProductPhotoID chiave deve essere specificato per identificare l'immagine. Nel recupero di un riferimento all'immagine come illustrato in questo esempio, è necessario specificare anche la chiave primaria della tabella nella SELECT clausola per identificare in modo univoco una riga.
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=70
FOR XML AUTO;
Risultato:
-- result
<Production.ProductPhoto
ProductPhotoID="70"
ThumbNailPhoto= "dbobject/Production.ProductPhoto[@ProductPhotoID='70']/@ThumbNailPhoto" />
La stessa query viene eseguita con l'opzione BINARY BASE64 . La query restituisce i dati binari in formato con codifica Base64.
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=70
FOR XML AUTO, BINARY BASE64;
Risultato:
-- result
<Production.ProductPhoto ProductPhotoID="70" ThumbNailPhoto="Base64 encoded photo" />
Per impostazione predefinita, quando si usa la modalità AUTO per recuperare i dati binari, verrà restituito un riferimento a un URL relativo alla radice virtuale del database in cui è stata eseguita la query anziché i dati binari. Ciò si verifica se l'opzione BINARY BASE64 non è specificata.
Quando la modalità AUTO restituisce un riferimento URL ai dati binari nei 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. Tuttavia, il caso restituito nel riferimento non sarà coerente. Per esempio:
SELECT ProductPhotoID, ThumbnailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=70
FOR XML AUTO;
Risultato:
<Production.PRODUCTPHOTO
PRODUCTPHOTOID="70"
THUMBNAILPHOTO= "dbobject/Production.PRODUCTPHOTO[@ProductPhotoID='70']/@ThumbNailPhoto" />
Può trattarsi di un problema in particolare quando le query dbobject vengono eseguite su un database con distinzione tra maiuscole e minuscole. Per evitare questo problema, il caso del nome della tabella o della colonna specificato nelle query deve corrispondere al caso del nome della tabella o della colonna nel database.
Esempio: Informazioni sulla codifica
Questo esempio mostra le varie codifiche che si verificano nel risultato.
Creare questa tabella:
CREATE TABLE [Special Chars] (Col1 char(1) primary key, [Col#&2] varbinary(50));
Aggiungere i dati seguenti alla tabella:
INSERT INTO [Special Chars] VALUES ('&', 0x20), ('#', 0x20);
Questa query restituisce i dati della tabella. Viene specificata la modalità FOR XML AUTO. I dati binari vengono restituiti come riferimento.
SELECT * FROM [Special Chars] FOR XML AUTO;
Risultato:
<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"
/>
Questo è il processo per la codifica di caratteri speciali nel risultato:
Nel risultato della query i caratteri XML e URL speciali nei nomi di elemento e attributo restituiti vengono codificati usando il valore esadecimale del carattere Unicode corrispondente. Nel risultato precedente, il nome <
Special Chars> dell'elemento viene restituito come .<Special_x0020_Chars> Il nome <Col#&2> dell'attributo viene restituito come .<Col_x0023__x0026_2> I caratteri speciali XML e URL vengono codificati.Se i valori degli elementi o degli attributi contengono una delle cinque entità carattere XML standard (', "", <, >e &), questi caratteri XML speciali vengono sempre codificati usando la codifica dei caratteri XML. Nel risultato precedente, il valore
&nel valore dell'attributo <Col1> viene codificato come&. Tuttavia, il carattere # rimane #, perché è un carattere XML valido e non un carattere XML speciale.Se i valori degli elementi o degli attributi contengono caratteri URL speciali che hanno un significato speciale nell'URL, vengono codificati solo nel valore DELL'URL DBOBJECT e vengono codificati solo quando il carattere speciale fa parte di una tabella o di un nome di colonna. Nel risultato, il carattere
#che fa parte del nomeCol#&2della tabella viene codificato come_x0023_ in the DBOJBECT URL.