Udostępnij za pomocą


Przykład: pobieranie informacji o pracownikach

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Ten przykład pobiera identyfikator pracownika i nazwę pracownika dla każdego pracownika. AdventureWorks2025 W bazie danych identyfikator employeeID można uzyskać z kolumny BusinessEntityID w tabeli Employee. Nazwy pracowników można uzyskać z tabeli Person. Kolumna BusinessEntityID może służyć do łączenia tabel.

Załóżmy, że chcesz, aby transformacja XML EXPLICIT wygenerowała kod XML, jak pokazano w poniższym przykładzie.

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

Ponieważ w hierarchii znajdują się dwa poziomy, należy napisać dwa zapytania SELECT i zastosować UNION ALL. Jest to pierwsze zapytanie, które pobiera wartości elementu <Employee> i jego atrybutów. Zapytanie przypisuje 1 jako Tag wartość dla elementu <Employee> i NULL jako Parent, ponieważ jest to element najwyższego poziomu.

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;

Jest to drugie zapytanie. Pobiera wartości elementu <Name> . Przypisuje 2 jako wartość dla elementu Tag i <Name> jako wartość tagu 1, identyfikując Parent jako element nadrzędny.

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;

Połącz te zapytania z UNION ALL, zastosuj FOR XML EXPLICIT, i określ wymaganą klauzulę ORDER BY. Najpierw należy posortować zestaw wierszy według BusinessEntityID , a następnie według nazwy, aby wartości NULL w nazwie pojawiały się jako pierwsze. Wykonując następujące zapytanie bez klauzuli FOR XML, można zobaczyć wygenerowaną tabelę uniwersalną.

Jest to końcowe zapytanie:

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;

Jest to wynik częściowy:

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

Pierwszy SELECT określa nazwy kolumn w wynikowym zestawie wierszy. Te nazwy tworzą dwie grupy kolumn. Grupa, która ma Tag wartość 1 w nazwie kolumny, identyfikuje Employee jako element i EmpID jako atrybut. Druga grupa kolumn ma Tag wartość 2 w kolumnie i identyfikuje <Name> jako element oraz FName i LName jako atrybuty.

W poniższej tabeli przedstawiono zestaw wierszy częściowych wygenerowany przez zapytanie:

Etykieta Rodzic Pracownik!1!EmpID Nazwa!2! Imię Imię!2!Nazwisko
1 ZERO 1 ZERO ZERO
2 1 1 Ken Sánchez
1 ZERO 2 ZERO ZERO
2 1 2 Terri Duffy
1 ZERO 3 ZERO ZERO
2 1 3 Roberto Tamburello
...\ ...\ ...\ ...\ ...\

W ten sposób wiersze w tabeli uniwersalnej są przetwarzane w celu wygenerowania wynikowego drzewa XML:

Pierwszy wiersz identyfikuje Tag wartość 1. W związku z tym grupa kolumn, która ma Tag wartość 1, zostaje zidentyfikowana, Employee!1!EmpID. Ta kolumna identyfikuje Employee jako nazwę elementu. Następnie element <Employee> zostanie utworzony, który ma atrybuty EmpID. Odpowiednie wartości kolumn są przypisywane do tych atrybutów.

Drugi wiersz ma Tag wartość 2. Zatem grupa kolumn, która ma Tag wartość 2 w nazwie kolumny Name!2!FName, Name!2!LName, jest identyfikowana. Te nazwy kolumn identyfikują Name jako nazwę elementu. Tworzy się element <Name> z atrybutami FName i LName. Odpowiednie wartości kolumn są następnie przypisywane do tych atrybutów. Ten wiersz identyfikuje 1 jako Parent. Ten element-dziecko jest dodawany do poprzedniego elementu <Employee>.

Ten proces jest powtarzany w przypadku pozostałych wierszy w zestawie wierszy. Zwróć uwagę na znaczenie porządkowania wierszy w tabeli uniwersalnej, aby funkcja FOR XML EXPLICIT mogła przetworzyć zestaw wierszy w kolejności i wygenerować odpowiedni kod XML.

Zobacz także