다음을 통해 공유


예: 직원 정보 검색

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance

다음은 각 직원의 직원 ID와 직원 이름을 검색하는 예제입니다. AdventureWorks2022 데이터베이스에서 employeeID는 Employee 테이블의 BusinessEntityID 열에서 가져올 수 있습니다. 직원 이름은 Person 테이블에서 가져올 수 있습니다. BusinessEntityID 열을 사용하여 테이블을 조인할 수 있습니다.

다음 샘플과 같이 FOR XML EXPLICIT 변환에서 XML을 생성하도록 가정합니다.

<Employee EmpID="1" >
  <Name FName="Ken" LName="Sánchez" />
</Employee>
...

계층 구조에는 두 개의 수준이 있으므로 두 개의 SELECT 쿼리를 작성하고 UNION ALL을 적용합니다. <Employee> 요소 및 해당 특성에 대한 값을 검색하는 첫 번째 쿼리입니다. 쿼리는 최상위 요소이므로 1 요소의 Tag 값으로 <Employee>를, 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;

이는 두 번째 쿼리입니다. <Name> 요소의 값을 검색합니다. 2 요소의 Tag 값으로 <Name>, 부모로 1를 식별하는 Parent 태그 값으로 <Employee>를 할당합니다.

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 절을 지정합니다. 이름에 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 는 결과 행 집합에 대해 열 이름을 지정합니다. 이러한 이름은 두 개의 열 그룹을 형성합니다. 열 이름에 Tag1이 있는 그룹은 Employee를 요소로 EmpID를 특성으로 식별합니다. 다른 열 그룹에는 열의 Tag2이 있으며 <Name>을 요소 및 FName으로, 특성으로 LName을 식별합니다.

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

태그 부모 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!FName, Name!2!LName,에 Tag2이 있는 열 그룹이 식별됩니다. 이러한 열 이름은 요소 이름으로 Name을 식별합니다. FNameLName 특성이 있는 <Name> 요소가 만들어집니다. 그런 다음 해당 열 값이 이러한 특성에 할당됩니다. 이 행은 1Parent을 식별합니다. 이 요소 자식은 이전 <Employee> 요소에 추가됩니다.

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

참고 항목