此範例會擷取每個員工的員工標識碼和員工名稱。 在 AdventureWorks2012 資料庫中,employeeID 可以從 Employee 數據表中的 BusinessEntityID 數據行取得。 員工名稱可以從 Person 數據表取得。 BusinessEntityID 數據行可用來聯結數據表。
假設您想要 FOR XML EXPLICIT 轉換產生 XML,如下所示:
<Employee EmpID="1" >
<Name FName="Ken" LName="S??nchez" />
</Employee>
...
因為階層中有兩個層級,因此您會撰寫 SELECT 兩個查詢並套用 UNION ALL。 這是第一個查詢以擷取<Employee>元素及其屬性值。 查詢會指派1為Tag值,給<Employee>元素,並將 NULL 指派為Parent,因為它是最上層元素。
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;
這是第二個查詢。 它會擷 <Name> 取元素的值。 它會將 元素的值指派2為 Tag 值<>Name,並1指派為識別Employee><為Parent父系的標記值。
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;
您可以結合這些查詢與 UNION ALL,套用 FOR XML EXPLICIT,並指定必要的 ORDER BY 子句。 您必須先依BusinessEntityID排序數據列集,然後依名稱排序,以使名稱中的 NULL 值先出現。 藉由執行下列沒有 FOR XML 子句的查詢,您可以看到產生的通用數據表。
這是最終查詢:
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;
以下是部份結果:
<Employee EmpID="1">
<Name FName="Ken" LName="S??nchez" />
</Employee>
<Employee EmpID="2">
<Name FName="Terri" LName="Duffy" />
</Employee>
...
第一個 SELECT 指定結果數據列集中數據行的名稱。 這些名稱形成兩個欄位群組。 在列名稱中顯示Tag值的群組會將Employee識別為元素,將EmpID識別為屬性。 另一個數據行群組在數據行中具有Tag值2,並識別<Name>為元素,FName 和 LName作為屬性。
下表顯示查詢所產生的部分資料列集:
Tag Parent Employee!1!EmpID Name!2!FName Name!2!LName
--- ------ ---------------- ------------ ------------
1 NULL 1 NULL NULL
2 1 1 Ken S??nchez
1 NULL 2 NULL NULL
2 1 2 Terri Duffy
1 NULL 3 NULL NULL
2 1 3 Roberto Tamburello
...
這是處理通用資料表中的數據列以產生產生的 XML 樹狀結構的方式:
第一列會識別Tag的值1。 因此,辨識具有 Tag 值 1 的數據列群組: Employee!1!EmpID。 此欄識別 Employee 為元素名稱。 將會接著建立具有EmpID屬性的<Employee>元素。 對應的欄位值會指派給這些屬性。
第二個資料欄位具有 Tag 值 2。 因此,識別數據行名稱Name!2!FNameName!2!LName、 中具有Tag值2的數據行群組。 這些數據行名稱會識別 Name 為元素名稱。
<
Name
> 元素建立,具有 FName 和 LName 屬性。 然後,對應的數據行值會指派給這些屬性。 此列將識別1為Parent。 這個子元素會添加到上一個 <Employee> 元素。
此程式會針對數據列集中的其餘數據列重複執行。 請注意排序通用數據表中數據列的重要性,讓 FOR XML EXPLICIT 可以依序處理數據列集,併產生您想要的 XML。