Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza 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.