Megosztás a következőn keresztül:


Példa: Alkalmazottak adatainak lekérése

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Ez a példa az egyes alkalmazottak alkalmazotti azonosítóját és alkalmazottnevét kéri le. Az AdventureWorks2025 adatbázisban az alkalmazottAzonosító az Alkalmazott tábla BusinessEntityID oszlopából szerezhető meg. Az alkalmazottak neve a Személy táblából kérhető le. A BusinessEntityID oszlop a táblák összekapcsolására használható.

Tegyük fel, hogy a FOR XML EXPLICIT átalakítás segítségével XML-t szeretne generálni az alábbi példa szerint.

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

Mivel a hierarchiában két szint található, két SELECT lekérdezést kell írnia, és az UNION ALL-t kell alkalmaznia. Ez az első lekérdezés, amely lekéri az elem és attribútumai <Employee> értékeit. A lekérdezés hozzárendeli a 1 értéket Tag értékként az <Employee> elemhez, és a NULL-t Parent elemként, mert ez a legfelső szintű elem.

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;

Ez a második lekérdezés. Lekéri az elem értékeit <Name> . 2 értékként történő hozzárendelése a Tag elemhez és <Name> címkeértékként, amelyek 1-t azonosítják szülőként.

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;

Ezeket a lekérdezéseket kombinálhatja UNION ALL-val, alkalmazza FOR XML EXPLICIT, és megadhatja a szükséges ORDER BY záradékot. Először BusinessEntityID szerint, majd név szerint kell rendeznie a sorhalmazt, hogy a név NULL értékei jelenjenek meg először. Ha a következő lekérdezést a FOR XML záradék nélkül hajtja végre, láthatja a létrehozott univerzális táblát.

Ez a végső lekérdezés:

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;

Ez a részleges eredmény:

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

Az első SELECT az eredményként kapott sorhalmaz oszlopainak nevét adja meg. Ezek a nevek két oszlopcsoportot alkotnak. Az Tag csoport, amelynek oszlopneve 1 értéket tartalmaz, elemként Employee-t és attribútumként EmpID-t azonosít. A másik oszlopcsoportnak az oszlopban van Tag értéke 2, és az elemként azonosítja <Name>-t, valamint attribútumként FName-t és LName-t.

Az alábbi táblázat a lekérdezés által létrehozott részleges sorhalmazt mutatja be:

Címke Szülő Alkalmazott!1! EmpID Név!2! Vezetéknév Név!2! Vezetéknév
1 NULLA 1 NULLA NULLA
2 1 1 Látóhatár Sánchez
1 NULLA 2 NULLA NULLA
2 1 2 Terri Duffy
1 NULLA 3 NULLA NULLA
2 1 3 Roberto Tamburello
... ... ... ... ...

A rendszer így dolgozza fel az univerzális tábla sorait az eredményként kapott XML-fa előállításához:

Az első sor azonosítja az Tag értéket 1. Ezért az oszlopcsoport, amely Tag értéket 1 tartalmaz, azonosítva van, Employee!1!EmpID. Ez az oszlop az elem neveként azonosítja Employee . Ezután létrejön egy <Employee> elem, amely attribútumokkal rendelkezik EmpID . A megfelelő oszlopértékek ezekhez az attribútumokhoz vannak rendelve.

A második sor értéke Tag2. Ezért az a oszlopcsoport kerül azonosításra, amelynek oszlopneve az Tag értéket 2 tartalmazza Name!2!FName, Name!2!LName. Ezek az oszlopnevek elemnévként vannak azonosítva Name . Létrejön egy <Name> elem, amely FName és LName attribútumokkal rendelkezik. A megfelelő oszlopértékek ezután ezekhez az attribútumokhoz lesznek hozzárendelve. Ez a sor a következőképpen azonosítja 1 : Parent. Ez a gyermekelem hozzá van adva az előző <Employee> elemhez.

Ez a folyamat a sorhalmaz többi sorában ismétlődik. Vegye figyelembe annak fontosságát, hogy az univerzális táblában rendezze a sorokat, hogy az XML EXPLICIT sorrendben tudja feldolgozni a sorhalmazt, és létrehozza a kívánt XML-t.

Lásd még