다음은 각 직원의 직원 ID와 직원 이름을 검색하는 예제입니다. AdventureWorks2012 데이터베이스의 EmployeeID는 Employee 테이블의 BusinessEntityID 열에서 가져올 수 있습니다. 직원 이름은 Person 테이블에서 가져올 수 있습니다. BusinessEntityID 열을 사용하여 테이블을 조인할 수 있습니다.
FOR XML EXPLICIT 변환에서 다음과 같이 XML을 생성하도록 가정합니다.
<Employee EmpID="1" >
<Name FName="Ken" LName="S??nchez" />
</Employee>
...
계층 구조에는 두 개의 수준이 있으므로 두 개의 SELECT 쿼리를 작성하고 UNION ALL을 적용합니다. 요소 및 해당 특성에 대한 값을 검색하는 <Employee> 첫 번째 쿼리입니다. 쿼리는 최상위 요소이므로 <Employee> 요소에 대한 값으로 1Tag을 할당하고, 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> 요소의 값으로 할당하고, <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와 결합하고 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 결과 행 집합의 열 이름을 지정합니다. 이러한 이름은 두 개의 열 그룹을 형성합니다. 열 이름에 1 값이 있는 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 .
<
>
Employee그런 다음 특성이 있는 EmpID 요소가 만들어집니다. 해당 열 값은 이러한 특성에 할당됩니다.
두 번째 행에는 Tag 값 2이 있습니다. 따라서 Name!2!FName 및 Name!2!LName이라는 열 이름에 2 값을 갖고 있는 Tag 열 그룹이 식별됩니다. 이러한 열 이름은 Name를 요소 이름으로 식별합니다.
<
Name
> 특성이 있는 LNameFName 요소가 만들어집니다. 그런 다음 해당 열 값이 이러한 특성에 할당됩니다. 이 행은 1를 Parent로 식별합니다. 이 요소 자식은 이전 <Employee> 요소에 추가됩니다.
이 프로세스는 행 집합의 나머지 행에 대해 반복됩니다. FOR XML EXPLICIT가 행 집합을 순서대로 처리하고 원하는 XML을 생성할 수 있도록 범용 테이블의 행 순서를 지정하는 것이 중요합니다.