この例では、各従業員の従業員 ID と従業員名を取得します。 AdventureWorks2012 データベースでは、Employee テーブルの BusinessEntityID 列から employeeID を取得できます。 従業員名は Person テーブルから取得できます。 BusinessEntityID 列を使用してテーブルを結合できます。
次に示すように、FOR XML EXPLICIT 変換で XML を生成するとします。
<Employee EmpID="1" >
<Name FName="Ken" LName="S??nchez" />
</Employee>
...
階層内には 2 つのレベルがあるため、2 つの SELECT
クエリを記述し、UNION ALL を適用します。 これは、 <Employee
> 要素とその属性の値を取得する最初のクエリです。 クエリでは、<Employee
>要素のTag
値として1
が割り当てられ、最上位要素であるため、Parent
として NULL が割り当てられます。
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;
これは 2 番目のクエリです。
<
Name
>要素の値を取得します。
<
Name
>要素のTag
値として2
を割り当て、<Employee
>を親として識別Parent
タグ値として1
します。
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 AL
L と組み合わせ、 FOR XML EXPLICIT
を適用し、必要な ORDER BY
句を指定します。 名前の NULL 値が最初に表示されるように、最初に行セットを BusinessEntityID
順に並べ替え、次に名前で並べ替える必要があります。 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
では、結果の行セット内の列の名前を指定します。 これらの名前は、2 つの列グループを形成します。 列名にTag
の値を持つグループは、Employee
を要素とし、EmpID
を属性として識別します。 もう 1 つの列グループには、列に2
Tag
値があり、<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
>要素が作成されます。 対応する列の値は、これらの属性に割り当てられます。
2 番目の行には、 Tag
値が 2
。 したがって、列名 (Name!2!FName
、Name!2!LName
) に2
Tag
値を持つ列グループが識別されます。 これらの列名は、 Name
を要素名として識別します。
FName
属性とLName
属性を持つ<Name
>要素が作成されます。 その後、対応する列の値がこれらの属性に割り当てられます。 この行は、Parent
として1
を識別します。 この要素の子は、前の <Employee
> 要素に追加されます。
このプロセスは、行セット内の残りの行に対して繰り返されます。 FOR XML EXPLICIT で行セットを順番に処理し、必要な XML を生成できるように、ユニバーサル テーブル内の行を並べ替える重要性に注意してください。