Contoh: Mengambil informasi karyawan

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Contoh ini mengambil ID karyawan dan nama karyawan untuk setiap karyawan. AdventureWorks2025 Dalam database, employeeID dapat diperoleh dari kolom BusinessEntityID dalam tabel Karyawan. Nama karyawan dapat diperoleh dari tabel Orang. Kolom BusinessEntityID dapat digunakan untuk menggabungkan tabel.

Asumsikan bahwa Anda ingin transformasi FOR XML EXPLICIT menghasilkan XML seperti yang ditunjukkan pada contoh berikut:

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

Karena ada dua tingkat dalam hierarki, Anda akan menulis dua SELECT kueri dan menerapkan UNION ALL. Ini adalah kueri pertama yang mengambil nilai untuk <Employee> elemen dan atributnya. Kueri menetapkan 1 sebagai nilai Tag untuk elemen <Employee> dan NULL sebagai Parent, karena elemen tersebut merupakan elemen tingkat atas.

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;

Ini adalah kueri kedua. Mengambil nilai untuk elemen <Name>. Ini menetapkan 2 sebagai nilai Tag untuk elemen <Name> dan 1 sebagai nilai tag Parent yang mengidentifikasi <Employee> sebagai induk.

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;

Anda menggabungkan kueri ini dengan UNION ALL, terapkan FOR XML EXPLICIT, dan tentukan klausa yang diperlukan ORDER BY . Anda harus mengurutkan kumpulan baris terlebih dahulu menurut BusinessEntityID lalu berdasarkan nama sehingga nilai NULL dalam nama muncul terlebih dahulu. Dengan menjalankan kueri berikut tanpa klausa FOR XML, Anda dapat melihat tabel universal yang dihasilkan.

Ini adalah kueri akhir:

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;

Ini adalah hasil parsial:

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

Yang pertama SELECT menentukan nama untuk kolom dalam himpunan baris yang dihasilkan. Nama-nama ini membentuk dua grup kolom. Grup yang memiliki Tag nilai 1 dalam nama kolom mengidentifikasi Employee sebagai elemen dan EmpID sebagai atribut . Grup kolom lainnya memiliki Tag nilai 2 dalam kolom dan mengidentifikasi <Name> sebagai elemen dan FName dan LName sebagai atribut.

Tabel berikut ini memperlihatkan set baris parsial yang dihasilkan oleh kueri:

Etiket Orang tua Karyawan!1!EmpID Nama!2!FName Nama!2!LName
1 NOL 1 NOL NOL
2 1 1 Ken Sánchez
1 NOL 2 NOL NOL
2 1 2 Terri Duffy
1 NOL 3 NOL NOL
2 1 3 Roberto Tamburello
... ... ... ... ...

Ini adalah bagaimana baris dalam tabel universal diproses untuk menghasilkan pohon XML yang dihasilkan:

Baris pertama mengidentifikasi Tag nilai 1. Oleh karena itu, grup kolom yang memiliki Tag nilai 1 diidentifikasi, Employee!1!EmpID. Kolom ini mengidentifikasi Employee sebagai nama elemen. Elemen <Employee> kemudian dibuat yang memiliki EmpID atribut. Nilai kolom terkait ditetapkan ke atribut ini.

Baris kedua bernilai Tag2. Oleh karena itu, grup kolom yang memiliki Tag nilai 2 dalam nama kolom, Name!2!FName, Name!2!LName, diidentifikasi. Nama kolom ini mengidentifikasi Name sebagai nama elemen. Elemen <Name> dibuat yang memiliki FName atribut dan LName . Nilai kolom yang sesuai kemudian ditetapkan ke atribut ini. Baris ini mengidentifikasi 1 sebagai Parent. Elemen anak ini ditambahkan ke elemen <Employee> sebelumnya.

Proses ini diulang untuk sisa baris lainnya dalam kumpulan baris. Perhatikan pentingnya mengurutkan baris dalam tabel universal sehingga FOR XML EXPLICIT dapat memproses set baris secara berurutan dan menghasilkan XML yang Anda inginkan.