Colonne provviste di un nome
Di seguito vengono illustrate le condizioni specifiche in cui viene eseguito il mapping tra le colonne del set di righe provviste di nome e il codice XML risultante, con distinzione tra maiuscole e minuscole:
Il nome di colonna inizia con un simbolo di chiocciola (@)
Il nome di colonna non inizia con un simbolo di chiocciola (@)
Il nome di colonna non inizia con un simbolo di chiocciola (@) e contiene una barra (/)
Più colonne condividono lo stesso prefisso.
Una colonna ha un nome diverso.
Il nome di colonna inizia con un simbolo di chiocciola (@)
Se il nome della colonna inizia con un simbolo di chiocciola e non contiene una barra (/), viene creato un attributo dell'elemento <row> con il valore di colonna corrispondente. Ad esempio, la query seguente restituisce un set di righe a due colonne (@PmId, Name). Nel codice XML risultante, un attributo PmId viene aggiunto all'elemento <row> corrispondente e gli viene assegnato un valore di ProductModelID.
SELECT ProductModelID as "@PmId",
Name
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH;
GO
Risultato:
<row PmId="7">
<Name>HL Touring Frame</Name>
</row>
Si noti che gli attributi devono precedere qualsiasi altro tipo di nodo presente nello stesso livello, ad esempio nodi di elemento e di testo. La query seguente restituirà un errore:
SELECT Name,
ProductModelID as "@PmId"
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH ;
GO
Il nome di colonna non inizia con un simbolo di chiocciola (@)
Se il nome di colonna non inizia con un simbolo di chiocciola (@), non è uno dei test di nodo XPath e non contiene una barra (/), viene creato un elemento XML che è un sottoelemento dell'elemento riga, per impostazione predefinita <row>.
La query seguente specifica il nome della colonna, il risultato. Un elemento figlio <result> viene pertanto aggiunto all'elemento <row>.
SELECT 2+2 as result
for xml PATH
Risultato:
<row>
<result>4</result>
</row>
La query seguente specifica il nome della colonna, ManuWorkCenterInformation, per il codice XML restituito dall'espressione XQuery specificata sulla colonna Instructions di tipo xml. Un elemento <ManuWorkCenterInformation> viene pertanto aggiunto come figlio dell'elemento <row>.
SELECT
ProductModelID,
Name,
Instructions.query('declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/MI:root/MI:Location
') as ManuWorkCenterInformation
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH;
GO
Risultato:
<row>
<ProductModelID>7</ProductModelID>
<Name>HL Touring Frame</Name>
<ManuWorkCenterInformation>
<MI:Location ...LocationID="10" ...></MI:Location>
<MI:Location ...LocationID="20" ...></MI:Location>
...
</ManuWorkCenterInformation>
</row>
Il nome di colonna non inizia con un simbolo di chiocciola (@) e contiene una barra (/)
Se il nome di colonna non inizia con un simbolo di chiocciola (@), ma contiene una barra (/), il nome della colonna indica una gerarchia XML. Ad esempio, se il nome della colonna è "Name1/Name2/Name3.../Namen ", ogni Namei rappresenta un nome elemento annidato nell'elemento di riga corrente (per i=1) o che si trova sotto l'elemento il cui nome è Namei-1. Se Namen inizia con il simbolo @, viene eseguito il mapping a un attributo dell'elemento Namen-1.
Ad esempio, la query seguente restituisce l'ID (BusinessEntityID) e il nome di un dipendente rappresentati come un elemento complesso EmpName che contiene nome, secondo nome e cognome.
SELECT BusinessEntityID "@EmpID",
FirstName "EmpName/First",
MiddleName "EmpName/Middle",
LastName "EmpName/Last"
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityIDID = P.BusinessEntityIDID
WHERE E.BusinessEntityID=4
FOR XML PATH;
I nomi di colonna vengono usati come un percorso nella creazione del codice XML in modalità PATH. Il nome della colonna che contiene i valori ID dipendente inizia con il simbolo @. Un attributo EmpID viene pertanto aggiunto all'elemento <row>. I nomi di tutte le altre colonne contengono una barra ("/"), che indica la gerarchia. Il codice XML risultante avrà l'elemento figlio <EmpName> sotto l'elemento <row> e l'elemento figlio <EmpName> avrà gli elementi figlio <First>, <Middle> e <Last>.
<row EmpID="4">
<EmpName>
<First>Rob</First>
<Last>Walters</Last>
</EmpName>
</row>
Il valore del secondo nome del dipendente è Null e, per impostazione predefinita, il valore Null corrisponde all'assenza dell'elemento o attributo. Se si desidera la generazione di elementi per i valori NULL, è possibile specificare la direttiva ELEMENTS con XSINIL, come illustrato in questa query.
SELECT E.BusinessEntityID "@EmpID",
FirstName "EmpName/First",
MiddleName "EmpName/Middle",
LastName "EmpName/Last"
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID
WHERE E.BusinessEntityID=4
FOR XML PATH, ELEMENTS XSINIL;
Risultato:
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
EmpID="4">
<EmpName>
<First>Rob</First>
<Middle xsi:nil="true"/>
<Last>Walters</Last>
</EmpName>
</row>
Per impostazione predefinita, la modalità PATH genera XML incentrato sugli elementi. Specificare la direttiva ELEMENTS in una query in modalità PATH non produce pertanto effetti. Come illustrato nell'esempio precedente tuttavia, la direttiva ELEMENTS risulta utile con XSINIL per la generazione di elementi per i valori Null.
Oltre all'ID e al nome, la query seguente recupera l'indirizzo di un dipendente. Come per il percorso nei nomi di colonna per le colonne degli indirizzi, un elemento figlio <Address> viene aggiunto all'elemento <row> e i dettagli relativi agli indirizzi vengono aggiunti come elementi figlio dell'elemento <Address>.
SELECT E.BusinessEntityID "@EmpID",
FirstName "EmpName/First",
MiddleName "EmpName/Middle",
LastName "EmpName/Last",
AddressLine1 "Address/AddrLine1",
AddressLine2 "Address/AddrLIne2",
City "Address/City"
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P ON E.BusinessEntityID = P.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress AS BEA
ON BEA.BusinessEntityID = P.BusinessEntityID
INNER JOIN Person.Address AS A ON A.AddressID = BEA.AddressID
WHERE E.BusinessEntityID = 4
FOR XML PATH
Risultato:
<row EmpID="4">
<EmpName>
<First>Rob</First>
<Last>Walters</Last>
</EmpName>
<Address>
<AddrLine1>5678 Lakeview Blvd.</AddrLine1>
<City>Minneapolis</City>
</Address>
</row>
Più colonne condividono lo stesso prefisso di percorso
Se più colonne successive condividono lo stesso prefisso di percorso, vengono raggruppate sotto lo stesso nome. Se vengono utilizzati prefissi degli spazi dei nomi diversi, anche se associati allo stesso spazio dei nomi, un percorso viene considerato diverso. Nella query precedente, le colonne FirstName, MiddleName e LastName condividono lo stesso prefisso EmpName. Vengono pertanto aggiunte come elementi figlio dell'elemento <EmpName>. Ciò si verifica anche nell'esempio precedente, nella fase di creazione dell'elemento <Address>.
Una colonna ha un nome diverso
Se è presente una colonna con un nome diverso, interromperà il raggruppamento, come illustrato nella query modificata seguente. La query interrompe il raggruppamento di FirstName, MiddleName e LastName, come specificato nella query precedente, aggiungendo colonne di indirizzi fra le colonne FirstName e MiddleName.
SELECT E.BusinessEntityID "@EmpID",
FirstName "EmpName/First",
AddressLine1 "Address/AddrLine1",
AddressLine2 "Address/AddrLine2",
City "Address/City",
MiddleName "EmpName/Middle",
LastName "EmpName/Last"
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P ON E.BusinessEntityID = P.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress AS BEA
ON BEA.BusinessEntityID = P.BusinessEntityID
INNER JOIN Person.Address AS A ON A.AddressID = BEA.AddressID
WHERE E.BusinessEntityID = 4
FOR XML PATH;
Di conseguenza, la query crea due elementi <EmpName>. Il primo elemento <EmpName> ha l'elemento figlio <FirstName> e il secondo elemento <EmpName> ha gli elementi figlio <MiddleName> e <LastName>.
Risultato:
<row EmpID="4">
<EmpName>
<First>Rob</First>
</EmpName>
<Address>
<AddrLine1>5678 Lakeview Blvd.</AddrLine1>
<City>Minneapolis</City>
</Address>
<EmpName>
<Last>Walters</Last>
</EmpName>
</row>