Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
In dit voorbeeld worden een werknemer-id en werknemernaam opgehaald voor elke werknemer. In de AdventureWorks2022 database kan de employeeID worden verkregen uit de kolom BusinessEntityID in de tabel Werknemer. Namen van werknemers kunnen worden verkregen uit de tabel Persoon. De kolom BusinessEntityID kan worden gebruikt om de tabellen samen te voegen.
Stel dat u WILT dat FOR XML EXPLICIT-transformatie XML genereert, zoals wordt weergegeven in het volgende voorbeeld:
<Employee EmpID="1" >
<Name FName="Ken" LName="Sánchez" />
</Employee>
...
Omdat er twee niveaus in de hiërarchie zijn, schrijft u twee SELECT query's en past u UNION ALL toe. Dit is de eerste query waarmee waarden voor het <Employee> element en de bijbehorende kenmerken worden opgehaald. De query wijst 1 toe als Tag waarde voor het <Employee> element en NULL als Parent, omdat dit het element op het hoogste niveau is.
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;
Dit is de tweede query. Hiermee worden waarden opgehaald voor het <Name> element. Het wijst 2 toe als de Tag waarde voor het <Name> element en 1 als de Parent waarde, waarbij <Employee> wordt geïdentificeerd als het bovenliggende element.
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;
U combineert deze query's met UNION ALL, past FOR XML EXPLICIT toe en geeft de vereiste ORDER BY clausule op. U moet eerst de rijenset sorteren op BusinessEntityID en vervolgens op naam, zodat de NULL-waarden in de naam eerst worden weergegeven. Door de volgende query uit te voeren zonder de FOR XML-component, ziet u de universele tabel die is gegenereerd.
Dit is de laatste 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;
Dit is het gedeeltelijke resultaat:
<Employee EmpID="1">
<Name FName="Ken" LName="Sánchez" />
</Employee>
<Employee EmpID="2">
<Name FName="Terri" LName="Duffy" />
</Employee>
...
De eerste SELECT geeft namen op voor kolommen in de resulterende rijenset. Deze namen vormen twee kolomgroepen. De groep met Tag waarde 1 in de kolomnaam identificeert Employee zich als een element en EmpID als het kenmerk. De andere kolomgroep heeft Tag waarde 2 in de kolom en identificeert <Name> als het element en FNameLName als de kenmerken.
In de volgende tabel ziet u de gedeeltelijke rijenset die door de query is gegenereerd:
| Etiket | Ouder | Werknemer!1!EmpID | Naam!2! Voornaam | Naam!2!Achternaam |
|---|---|---|---|---|
| 1 | NUL | 1 | NUL | NUL |
| 2 | 1 | 1 | Ken | Sánchez |
| 1 | NUL | 2 | NUL | NUL |
| 2 | 1 | 2 | Terri | Duffy |
| 1 | NUL | 3 | NUL | NUL |
| 2 | 1 | 3 | Roberto | Tamburello |
| ... | ... | ... | ... | ... |
Dit is hoe de rijen in de universele tabel worden verwerkt om de resulterende XML-structuur te produceren:
De eerste rij identificeert Tag de waarde 1. Daarom wordt de kolomgroep met de Tag waarde 1 geïdentificeerd, Employee!1!EmpID. Deze kolom identificeert Employee als de elementnaam. Er wordt vervolgens een <Employee> element gemaakt met EmpID kenmerken. Overeenkomende kolomwaarden worden toegewezen aan deze kenmerken.
De tweede rij heeft de Tag waarde 2. Daarom wordt de kolomgroep, die de Tag waarde 2 in de kolomnaam Name!2!FName, Name!2!LName heeft, geïdentificeerd. Deze kolomnamen identificeren Name als de elementnaam. Er wordt een <Name> element gemaakt met FName kenmerken en LName kenmerken. Overeenkomende kolomwaarden worden vervolgens toegewezen aan deze kenmerken. Deze rij geeft aan 1 als Parent. Dit kindelement wordt toegevoegd aan het vorige <Employee> element.
Dit proces wordt herhaald voor de rest van de rijen in de dataset. Let op het belang van het ordenen van de rijen in de universele tabel, zodat FOR XML EXPLICIT de rijenset in volgorde kan verwerken en de gewenste XML kan genereren.