예: 직원 정보 검색
이 예에서는 각 직원에 대한 직원 ID와 직원 이름을 검색합니다. AdventureWorks 데이터베이스에서 employeeID는 Employee 테이블로부터 가져올 수 있습니다. 직원 이름은 Contact 테이블로부터 가져올 수 있습니다. ContactID 열을 사용하면 테이블을 조인할 수 있습니다.
FOR XML EXPLICIT 변환으로 다음과 같이 XML을 생성한다고 가정해 보십시오.
<Employee EmpID="1" >
<Name FName="Guy" LName="Gilbert" />
</Employee>
...
계층에 두 수준이 있기 때문에 두 개의 SELECT 쿼리를 작성하고 UNION ALL을 적용합니다. 이 쿼리는 <Employee> 요소에 대한 값과 해당 특성을 검색하는 첫 번째 쿼리입니다. 이 쿼리는 <Employee> 요소에 대한 Tag 값으로 1을 할당하고 최상위 요소이기 때문에 Parent에는 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> 요소에 대한 Tag 값으로 2를 할당하고 <Employee>를 부모로 지정하는 Parent 태그 값으로 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는 결과 행 집합에 대해 열 이름을 지정합니다. 이러한 이름은 두 개의 열 그룹을 형성합니다. 열 이름에서 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 Guy Gilbert
1 NULL 2 NULL NULL
2 1 2 Kevin Brown
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을 생성하기 위해서는 범용 테이블의 행을 정렬하는 것이 중요합니다.