Esempio: Recupero di informazioni sui dipendentiExample: Retrieving Employee Information

In questo esempio vengono recuperati ID e nome di ogni dipendente.This example retrieves an employee ID and employee name for each employee. Nel database AdventureWorks2012AdventureWorks2012 è possibile ottenere il valore employeeID dalla colonna BusinessEntityID della tabella Employee.In the AdventureWorks2012AdventureWorks2012 database, the employeeID can be obtained from the BusinessEntityID column in the Employee table. I nomi dei dipendenti possono essere ottenuti dalla tabella Person.Employee names can be obtained from the Person table. La colonna BusinessEntityID può essere utilizzata per unire in join le tabelle.The BusinessEntityID column can be used to join the tables.

Si supponga di voler utilizzare la trasformazione FOR XML EXPLICIT per generare codice XML come illustrato di seguito:Assume that you want FOR XML EXPLICIT transformation to generate XML as shown in the following:

<Employee EmpID="1" >  
  <Name FName="Ken" LName="Sánchez" />  
</Employee>  
...  

Poiché la gerarchia contiene due livelli, è necessario scrivere due query SELECT e applicare UNION ALL.Because there are two levels in the hierarchy, you would write two SELECT queries and apply UNION ALL. Questa è la prima query che recupera i valori per l'elemento <Employee> e i relativi attributi.This is the first query that retrieves values for the <Employee> element and its attributes. La query assegna 1 come valore di Tag per l'elemento <Employee> e NULL come Parent, poiché si tratta dell'elemento di livello principale.The query assigns 1 as Tag value for the <Employee> element and NULL as Parent, because it is the top-level element.

SELECT 1    as Tag,  
       NULL as Parent,  
       E.BusinessEntityID AS [Employee!1!EmpID],  
       NULL       as [Name!2!FName],  
       NULL       as [Name!2!LName]  
FROM   HumanResources.Employee AS E  
INNER JOIN Person.Person AS P  
ON  E.BusinessEntityID = P.BusinessEntityID;  

Di seguito è riportata la seconda query,This is the second query. che recupera i valori per l'elemento <Name>.It retrieves values for the <Name> element. Assegna 2 come valore di Tag per l'elemento <Name> e 1 come valore di tag Parent, identificando <Employee> come elemento padre.It assigns 2 as Tag value for the <Name> element and 1 as Parent tag value identifying <Employee> as the parent.

SELECT 2 as Tag,  
       1 as Parent,  
       E.BusinessEntityID,  
       FirstName,   
       LastName   
FROM   HumanResources.Employee AS E  
INNER JOIN Person.Person AS P  
ON  E.BusinessEntityID = P.BusinessEntityID;  

È necessario combinare queste query con UNION ALL, applicare FOR XML EXPLICIT e specificare la clausola obbligatoria ORDER BY.You combine these queries with UNION ALL, apply FOR XML EXPLICIT, and specify the required ORDER BY clause. Il set di righe deve essere ordinato prima per BusinessEntityID e quindi per nome, in modo che i valori NULL nel nome vengano visualizzati per primi.You must sort the rowset first by BusinessEntityID and then by name so that the NULL values in the name appear first. Eseguendo la query successiva senza la clausola FOR XML viene generata la tabella universale.By executing the following query without the FOR XML clause, you can see the universal table generated.

La query finale sarà pertanto:This is the final query:

SELECT 1    as Tag,  
       NULL as Parent,  
       E.BusinessEntityID as [Employee!1!EmpID],  
       NULL       as [Name!2!FName],  
       NULL       as [Name!2!LName]  
FROM   HumanResources.Employee AS E  
INNER JOIN Person.Person AS P  
ON  E.BusinessEntityID = P.BusinessEntityID  
UNION ALL  
SELECT 2 as Tag,  
       1 as Parent,  
       E.BusinessEntityID,  
       FirstName,   
       LastName   
FROM   HumanResources.Employee AS E  
INNER JOIN Person.Person AS P  
ON  E.BusinessEntityID = P.BusinessEntityID  
ORDER BY [Employee!1!EmpID],[Name!2!FName]  
FOR XML EXPLICIT;  

Risultato parziale:This is the partial result:

<Employee EmpID="1">

<Name FName="Ken" LName="Sánchez" />

</Employee>

<Employee EmpID="2">

<Name FName="Terri" LName="Duffy" />

</Employee>

...

La prima istruzione SELECT specifica i nomi per le colonne nel set di righe risultante.The first SELECT specifies names for columns in the resulting rowset. I nomi formano due gruppi di colonne.These names form two column groups. Il gruppo con valore di Tag pari a 1 nel nome della colonna identifica Employee come elemento ed EmpID come attributo.The group that has Tag value 1 in the column name identifies Employee as an element and EmpID as the attribute. L'altro gruppo di colonne contiene il valore di Tag 2 nella colonna e identifica <Name> come elemento e FName e LName come attributi.The other column group has Tag value 2 in the column and identifies <Name> as the element and FName and LName as the attributes.

La tabella seguente mostra il set di righe parziale generato dalla query:The following table shows the partial rowset generated by the query:

Tag Parent Employee!1!EmpID Name!2!FName Name!2!LName

--- ------ ---------------- ------------ ------------

1 NULL 1 NULL NULL

2 1 1 Ken Sánchez

1 NULL 2 NULL NULL

2 1 2 Terri Duffy

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:This is how the rows in the universal table are processed to produce the resulting XML tree:

La prima riga identifica il valore Tag come 1.The first row identifies Tag value 1. Viene pertanto identificato il gruppo di colonne con il valore Tag di 1 , Employee!1!EmpID.Therefore, the column group that has the Tag value 1 is identified, Employee!1!EmpID. Questa colonna identifica Employee come nome dell'elemento.This column identifies Employee as the element name. Viene quindi creato un elemento <Employee> con attributi EmpID.An <Employee> element is then created that has EmpID attributes. A questi attributi vengono assegnati i valori di colonna corrispondenti.Corresponding column values are assigned to these attributes.

La seconda riga ha il valore Tag di 2.The second row has the Tag value 2. Viene pertanto identificato il gruppo di colonne con il valore Tag di 2 nel nome della colonna, Name!2!FName, Name!2!LName.Therefore, the column group that has the Tag value 2 in the column name, Name!2!FName, Name!2!LName, is identified. Questi nomi di colonna identificano Name come nome dell'elemento.These column names identify Name as element name. Viene creato un elemento <Name> con attributi FName e LName.A <Name> element is created that has FName and LName attributes. A questi attributi vengono quindi assegnati i valori di colonna corrispondenti.Corresponding column values are then assigned to these attributes. Questa riga identifica 1 come valore di Parent.This row identifies 1 as Parent. Questo elemento figlio viene aggiunto all'elemento <Employee> precedente.This element child is added to the previous <Employee> element.

Il processo viene ripetuto per tutte le righe del set di righe.This process is repeated for rest of the rows in the rowset. 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.Note the importance of ordering the rows in the universal table so that FOR XML EXPLICIT can process the rowset in order and generate the XML you want.

Vedere ancheSee Also

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