다음을 통해 공유


예: 직원 정보 검색

다음은 각 직원의 직원 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>을/를 요소로, FNameLName을/를 특성으로 식별합니다.

다음 표에서는 쿼리에서 생성된 부분 행 집합을 보여 줍니다.

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로 식별합니다. 따라서 Tag1을 가진 열 그룹이 식별됩니다Employee!1!EmpID. 이 열은 요소 이름으로 식별됩니다 Employee . < > Employee그런 다음 특성이 있는 EmpID 요소가 만들어집니다. 해당 열 값은 이러한 특성에 할당됩니다.

두 번째 행에는 Tag2이 있습니다. 따라서 Name!2!FNameName!2!LName이라는 열 이름에 2 값을 갖고 있는 Tag 열 그룹이 식별됩니다. 이러한 열 이름은 Name를 요소 이름으로 식별합니다. < Name > 특성이 있는 LNameFName 요소가 만들어집니다. 그런 다음 해당 열 값이 이러한 특성에 할당됩니다. 이 행은 1Parent로 식별합니다. 이 요소 자식은 이전 <Employee> 요소에 추가됩니다.

이 프로세스는 행 집합의 나머지 행에 대해 반복됩니다. FOR XML EXPLICIT가 행 집합을 순서대로 처리하고 원하는 XML을 생성할 수 있도록 범용 테이블의 행 순서를 지정하는 것이 중요합니다.

또한 참조하십시오

FOR XML에서 EXPLICIT 모드 사용