共用方式為


範例:擷取員工資訊

此範例會擷取每個員工的員工識別碼及員工名稱。在 AdventureWorks 資料庫中,employeeID 可以從 Employee 資料表取得。員工名稱可以從 Contact 資料表取得。ContactID 資料行可用於聯結資料表。

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

<Employee EmpID="1" >
  <Name FName="Guy" LName="Gilbert" />
</Employee>
...

因為階層中有兩個層級,所以您要撰寫兩個 SELECT 查詢並套用 UNION ALL。上述為第一個查詢,其會擷取 <Employee> 元素及其屬性的值。查詢將 1 指派為 <Employee> 元素的 **「標記」值,而因為是最上層元素,所以「父系」**為 NULL。

SELECT 1    as Tag,
       NULL as Parent,
       EmployeeID as [Employee!1!EmpID],
       NULL       as [Name!2!FName],
       NULL       as [Name!2!LName]
FROM   HumanResources.Employee E, Person.Contact C
WHERE  E.ContactID = C.ContactID

上述為第二個查詢。它會擷取 <Name> 元素的值。將 <Name> 元素的**「標記」值指派為 2,而可將 <Employee> 識別為父系的「父系」**標記值為 1。

SELECT 2 as Tag,
       1 as Parent,
       EmployeeID,
       FirstName, 
       LastName 
FROM   HumanResources.Employee E, Person.Contact C
WHERE  E.ContactID = C.ContactID

您可以利用 UNION ALL 合併這些查詢,套用 FOR XML EXPLICIT,然後指定所需的 ORDER BY 子句。您必須先按 EmployeeID 排序資料列集,然後再按名稱排列,如此名稱中的 NULL 值才會最先出現。執行以下未使用 FOR XML 子句的查詢,就可以看見產生了通用資料表。

以下為最後查詢:

SELECT 1    as Tag,
       NULL as Parent,
       EmployeeID as [Employee!1!EmpID],
       NULL       as [Name!2!FName],
       NULL       as [Name!2!LName]
FROM   HumanResources.Employee E, Person.Contact C
WHERE  E.ContactID = C.ContactID
UNION ALL
SELECT 2 as Tag,
       1 as Parent,
       EmployeeID,
       FirstName, 
       LastName 
FROM   HumanResources.Employee E, Person.Contact C
WHERE  E.ContactID = C.ContactID
ORDER BY [Employee!1!EmpID],[Name!2!FName]
FOR XML EXPLICIT

以下是部份結果:

<Employee EmpID="1">
  <Name FName="Guy" LName="Gilbert" />
</Employee>
<Employee EmpID="2">
  <Name FName="Kevin" LName="Brown" />
</Employee>
...

第一個 SELECT 會指定結果資料列集中的資料行名稱。這些名稱會形成兩個資料行群組。資料行名稱中有**「標記」**值 1 的群組,可將 Employee 識別為元素,而 EmpID 則識別為屬性。其他資料行群組在資料行中有「標記」值 2,而且可將 <Name> 識別為元素,而 FName 及 LName 則識別為屬性。

下表會顯示此查詢產生的部份資料列集:

Tag Parent  Employee!1!EmpID Name!2!FName Name!2!LName
----------- ----------- ---------------- -------------------
1    NULL     1                NULL          NULL
2     1       1                Guy           Gilbert
1    NULL     2                NULL          NULL
2     1       2                Kevin         Brown
1    NULL     3                NULL          NULL
2     1       3                Roberto       Tamburello 
...

以下是如何處理通用資料表的資料列,以產生結果 XML 樹狀結構:

第一個資料列會識別**「標記」值 1。因此,會識別「標記」**值 1 的資料行群組 Employee!1!EmpID。此資料行會將 Employee 識別為元素名稱。然後就會建立擁有 EmpID 屬性的 <Employee> 元素。對應的資料行值會指派給這些屬性。

第二個資料列具有**「標記」值 2。因此會識別資料行名稱 Name!2!FName 中具有「標記」值 2 的資料行群組 Name!2!LName。這些資料行會將 Name 識別為元素名稱。此外會建立擁有 FName 與 LName 屬性的 <Name> 元素。然後將對應的資料行值指派給這些屬性。此資料列會將 1 識別為「父系」**。就會將此元素子系增加到先前的 <Employee> 元素。

這個處理序會對資料列集中其餘的資料列重複進行。請記下通用資料表中資料列排序的優先順序,如此 FOR XML EXPLICIT 就可以依序處理資料列集,並產生您想要的 XML。

請參閱

參考