共用方式為


範例:擷取員工資訊

此範例會擷取每個員工的員工標識碼和員工名稱。 在 AdventureWorks2012 資料庫中,employeeID 可以從 Employee 數據表中的 BusinessEntityID 數據行取得。 員工名稱可以從 Person 數據表取得。 BusinessEntityID 數據行可用來聯結數據表。

假設您想要 FOR XML EXPLICIT 轉換產生 XML,如下所示:

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

因為階層中有兩個層級,因此您會撰寫 SELECT 兩個查詢並套用 UNION ALL。 這是第一個查詢以擷取<Employee>元素及其屬性值。 查詢會指派1Tag值,給<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> 取元素的值。 它會將 元素的值指派2Tag 值<>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識別為屬性。 另一個數據行群組在數據行中具有Tag2,並識別<Name>為元素,FNameLName作為屬性。

下表顯示查詢所產生的部分資料列集:

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。 因此,辨識具有 Tag1 的數據列群組: Employee!1!EmpID。 此欄識別 Employee 為元素名稱。 將會接著建立具有EmpID屬性的<Employee>元素。 對應的欄位值會指派給這些屬性。

第二個資料欄位具有 Tag2。 因此,識別數據行名稱Name!2!FNameName!2!LName、 中具有Tag2的數據行群組。 這些數據行名稱會識別 Name 為元素名稱。 < Name > 元素建立,具有 FNameLName 屬性。 然後,對應的數據行值會指派給這些屬性。 此列將識別1Parent。 這個子元素會添加到上一個 <Employee> 元素。

此程式會針對數據列集中的其餘數據列重複執行。 請注意排序通用數據表中數據列的重要性,讓 FOR XML EXPLICIT 可以依序處理數據列集,併產生您想要的 XML。

另請參閱

使用 EXPLICIT 模式搭配 FOR XML