Sdílet prostřednictvím


Příklad: Načtení informací o zaměstnanech

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Tento příklad načte ID zaměstnance a jméno zaměstnance pro každého zaměstnance. AdventureWorks2025 V databázi lze ID zaměstnance získat ze sloupce BusinessEntityID v tabulce Zaměstnanec. Jména zaměstnanců lze získat z tabulky Osoba. Sloupec BusinessEntityID lze použít ke spojení tabulek.

Předpokládejme, že chcete, aby explicitní transformace XML vygenerovala XML, jak je znázorněno v následující ukázce:

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

Vzhledem k tomu, že v hierarchii existují dvě úrovně, napíšete dva SELECT dotazy a použijete union ALL. Toto je první dotaz, který načte hodnoty pro <Employee> prvek a jeho atributy. Dotaz přiřadí 1 jako Tag hodnotu elementu <Employee> a null jako Parent, protože se jedná o prvek nejvyšší úrovně.

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;

Toto je druhý dotaz. Načte hodnoty pro <Name> prvek. Přiřadí jako 2 hodnotu prvku Tag a <Name> jako 1 hodnotu značky Parent identifikující <Employee> jako nadřazený prvek.

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;

Tyto dotazy zkombinujete s UNION ALL, použít FOR XML EXPLICITa zadat požadovanou ORDER BY klauzuli. Nejprve je nutné sadu řádků seřadit podle BusinessEntityID a poté podle názvu, aby se hodnoty NULL v názvu zobrazovaly jako první. Spuštěním následujícího dotazu bez klauzule FOR XML uvidíte vygenerovanou univerzální tabulku.

Toto je konečný dotaz:

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;

Toto je částečný výsledek:

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

První SELECT určuje názvy sloupců ve výsledné sadě řádků. Tyto názvy tvoří dvě skupiny sloupců. Skupina, která má Tag hodnotu 1 v názvu sloupce identifikuje Employee jako prvek a EmpID jako atribut. Druhá skupina sloupců má Tag ve sloupci hodnotu 2 a identifikuje <Name> jako prvek a FNameLName jako atributy.

Následující tabulka ukazuje částečnou sadu řádků vygenerovanou dotazem:

Štítek Rodič Zaměstnanec!1!EmpID Název!2!FName Jméno!2!Příjmení
1 NULA 1 NULA NULA
2 1 1 Rozsah znalostí Sánchez
1 NULA 2 NULA NULA
2 1 2 Terri Duffy
1 NULA 3 NULA NULA
2 1 3 Roberto Tamburello
... ... ... ... ...

Takto se zpracují řádky v univerzální tabulce a vytvoří výsledný strom XML:

První řádek identifikuje Tag hodnotu 1. Proto je identifikována Tagskupina sloupců, která má 1 hodnotu Employee!1!EmpID . Tento sloupec identifikuje Employee jako název elementu. Vytvoří se prvek <Employee>, který má atributy EmpID. K těmto atributům jsou přiřazeny odpovídající hodnoty sloupců.

Druhý řádek má Tag hodnotu 2. Proto je identifikována skupina sloupců, které mají hodnotu Tag2 ve jménu sloupce Name!2!FName, Name!2!LName. Tyto názvy sloupců identifikují Name jako název elementu. Je vytvořen <Name> prvek, který má FName a LName atributy. Odpovídající hodnoty sloupců se pak přiřadí k těmto atributům. Tento řádek identifikuje 1 jako Parent. Tento podřízený prvek je přidán do předchozího <Employee> prvku.

Tento proces se opakuje pro zbytek řádků v sadě řádků. Všimněte si důležitosti řazení řádků v univerzální tabulce tak, aby for XML EXPLICIT mohl zpracovat sadu řádků v pořadí a vygenerovat požadovaný KÓD XML.

Viz také