Esempio: Recupero di informazioni sui dipendenti
In questo esempio vengono recuperati ID e nome di ogni dipendente. Nel database AdventureWorks è possibile ottenere il valore employeeID dalla tabella Employee. I nomi dei dipendenti possono essere ottenuti dalla tabella Contact. La colonna ContactID può essere utilizzata per unire in join le tabelle.
Si supponga di voler utilizzare la trasformazione FOR XML EXPLICIT per generare codice XML come illustrato di seguito:
<Employee EmpID="1" >
<Name FName="Guy" LName="Gilbert" />
</Employee>
...
Poiché la gerarchia contiene due livelli, è necessario scrivere due query SELECT e applicare UNION ALL. Questa è la prima query che recupera i valori per l'elemento <Employee> e i relativi attributi. La query assegna 1 come valore di Tag per l'elemento <Employee> e NULL come Parent, poiché si tratta dell'elemento di livello principale.
SELECT 1 as Tag,
NULL as Parent,
EmployeeID as [Employee!1!EmpID],
NULL as [Name!2!FName],
NULL as [Name!2!LName]
FROM HumanResources.Employee E, Person.Contact C
WHERE E.ContactID = C.ContactID
Di seguito è riportata la seconda query, che recupera i valori per l'elemento <Name>. Assegna 2 come valore di Tag per l'elemento <Name> e 1 come valore di tag Parent, identificando <Employee> come elemento padre.
SELECT 2 as Tag,
1 as Parent,
EmployeeID,
FirstName,
LastName
FROM HumanResources.Employee E, Person.Contact C
WHERE E.ContactID = C.ContactID
È necessario combinare le query con UNION ALL, applicare FOR XML EXPLICIT e specificare la clausola necessaria ORDER BY. Il set di righe va ordinato prima per EmployeeID e quindi per nome, in modo che i valori NULL nel nome vengano visualizzati per primi. Eseguendo la query successiva senza la clausola FOR XML viene generata la tabella universale.
La query finale sarà pertanto:
SELECT 1 as Tag,
NULL as Parent,
EmployeeID as [Employee!1!EmpID],
NULL as [Name!2!FName],
NULL as [Name!2!LName]
FROM HumanResources.Employee E, Person.Contact C
WHERE E.ContactID = C.ContactID
UNION ALL
SELECT 2 as Tag,
1 as Parent,
EmployeeID,
FirstName,
LastName
FROM HumanResources.Employee E, Person.Contact C
WHERE E.ContactID = C.ContactID
ORDER BY [Employee!1!EmpID],[Name!2!FName]
FOR XML EXPLICIT
Risultato parziale:
<Employee EmpID="1">
<Name FName="Guy" LName="Gilbert" />
</Employee>
<Employee EmpID="2">
<Name FName="Kevin" LName="Brown" />
</Employee>
...
La prima istruzione SELECT specifica i nomi per le colonne nel set di righe risultante. I nomi formano due gruppi di colonne. Il gruppo con valore di Tag pari a 1 nel nome della colonna identifica Employee come elemento e EmpID come attributo. L'altro gruppo di colonne contiene il valore di Tag 2 nella colonna e identifica <Name> come elemento e FName e LName come attributi.
La tabella seguente mostra il set di righe parziale generato dalla query:
Tag Parent Employee!1!EmpID Name!2!FName Name!2!LName
----------- ----------- ---------------- -------------------
1 NULL 1 NULL NULL
2 1 1 Guy Gilbert
1 NULL 2 NULL NULL
2 1 2 Kevin Brown
1 NULL 3 NULL NULL
2 1 3 Roberto Tamburello
...
Di seguito viene descritto il processo di elaborazione delle righe della tabella universale per la creazione dell'albero XML risultante:
La prima riga identifica il valore 1 come Tag. Pertanto, il gruppo di colonne con il valore 1 Tag viene identificato, Employee!1!EmpID. Questa colonna identifica Employee come nome dell'elemento. Viene quindi creato un elemento <Employee> con attributi EmpID. A questi attributi vengono assegnati i valori di colonna corrispondenti.
La seconda riga ha il valore 2 di Tag . Viene pertanto identificato il gruppo di colonne che ha il valore 2 di Tag nel nome della colonna, Name!2!FName, Name!2!LName. Questi nomi di colonna identificano Name come nome dell'elemento. Viene creato un elemento <Name> con attributi FName e LName. A questi attributi vengono quindi assegnati i valori di colonna corrispondenti. Questa riga identifica 1 come valore di Parent. Questo elemento figlio viene aggiunto all'elemento <Employee> precedente.
Il processo viene ripetuto per tutte le righe del set di righe. Si noti l'importanza dell'ordinamento delle righe nella tabella universale, in modo che l'istruzione FOR XML EXPLICIT possa elaborare il set di righe nell'ordine corretto e generare il codice XML desiderato.