範例:擷取員工資訊
此範例會擷取每個員工的員工識別碼及員工名稱。在 AdventureWorks2008R2 資料庫中,employeeID 可以從 Employee 資料表中的 BusinessEntityID 資料行取得。員工名稱可以從 Person 資料表取得。BusinessEntityID 資料行可用於聯結資料表。
假設想要 FOR XML EXPLICIT 轉換產生 XML,如下所示:
<Employee EmpID="1" >
<Name FName="Ken" LName="Sánchez" />
</Employee>
...
因為階層中有兩個層級,所以您要撰寫兩個 SELECT 查詢並套用 UNION ALL。上述為第一個查詢,其會擷取 <Employee> 元素及其屬性的值。查詢會將 1 指派為 <Employee> 元素的 Tag 值,並將 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 指派為 <Name> 元素的 Tag 值,並將 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 值 1 的群組,可將 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。因此,會識別資料行名稱中 Tag 值為 2 的資料行群組 Name!2!FName、Name!2!LName。這些資料行名稱會將 Name 識別為元素名稱。此外會建立擁有 FName 與 LName 屬性的 <Name> 元素。然後將對應的資料行值指派給這些屬性。此資料列會將 1 識別為 Parent。此元素子系便會加入到先前的 <Employee> 元素。
這個處理序會對資料列集中其餘的資料列重複進行。請記下通用資料表中資料列排序的優先順序,如此 FOR XML EXPLICIT 就可以依序處理資料列集,並產生您想要的 XML。