다음을 통해 공유


이름이 있는 열

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

다음은 이름이 있는 행 집합 열이 대/소문자를 구분하여 결과 XML에 매핑되는 특정 조건입니다.

  • 열 이름이 @ 기호로 시작하는 경우

  • 열 이름이 @ 기호로 시작하지 않는 경우

  • 열 이름이 @ 기호로 시작하지 않고 슬래시 기호(/)를 포함하는 경우

  • 여러 열이 동일한 접두사를 공유하는 경우

  • 한 열의 이름이 다른 경우

열 이름이 @ 기호로 시작하는 경우

열 이름이 @ 기호로 시작하고 슬래시 표시(/)를 포함하지 않는 경우 해당 열 값이 있는 row 요소의 특성이 만들어집니다. 예를 들어 다음 쿼리는 2개의 열(@PmId, Name)로 구성된 행 집합을 반환합니다. 결과 XML에서 PmId 특성이 해당 row 요소에 추가되고 ProductModelID의 값이 여기에 할당됩니다.

SELECT ProductModelID as "@PmId",
       Name
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH;

다음은 결과입니다.

<row PmId="7">
  <Name>HL Touring Frame</Name>
</row>

특성은 같은 수준에서 요소 노드, 텍스트 노드 등 다른 노드 유형 앞에 와야 합니다. 다음 쿼리에서 오류가 반환됩니다.

SELECT Name,
       ProductModelID as "@PmId"
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH;

열 이름이 @ 기호로 시작하지 않는 경우

열 이름이 @ 기호로 시작하지 않고 XPath 노드 테스트 중 하나가 아니며 슬래시 표시(/)를 포함하지 않는 경우, 기본적으로 행 요소 row의 하위 요소인 XML 요소가 만들어집니다.

다음 쿼리는 결과로 열 이름을 지정합니다. 따라서 이 row 요소에 result 하위 요소가 추가됩니다.

SELECT 2 + 2 as result
for xml PATH;

다음은 결과입니다.

<row>
  <result>4</result>
</row>

다음 쿼리는 xml 형식의 Instructions 열에 대해 지정된 XQuery에서 반환된 XML의 열 이름인 ManuWorkCenterInformation을 지정합니다. 따라서 ManuWorkCenterInformation 요소가 row 요소의 자식으로 추가됩니다.

SELECT
  ProductModelID,
  Name,
  Instructions.query(
    'declare namespace MI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
     /MI:root/MI:Location
    ') as ManuWorkCenterInformation
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH;

다음은 결과입니다.

<row>
  <ProductModelID>7</ProductModelID>
  <Name>HL Touring Frame</Name>
  <ManuWorkCenterInformation>
    <MI:Location ...LocationID="10" ...></MI:Location>
    <MI:Location ...LocationID="20" ...></MI:Location>
     ...
  </ManuWorkCenterInformation>
</row>

열 이름이 @ 기호로 시작하지 않고 슬래시 기호(/)를 포함하는 경우

열 이름이 @ 기호로 시작하지 않지만 슬래시 기호(/)를 포함할 경우 열 이름은 XML 계층을 나타냅니다. 예를 들어 열 이름이 "Name1/Name2/Name3.../Namen"인 경우, 각 Namei는 현재 행 요소(i = 1인 경우)에 중첩되거나 이름 Namei-1이 있는 요소 아래에 있는 요소 이름을 나타냅니다. Namen@으로 시작하는 경우 Namen-1 요소의 특성에 매핑됩니다.

예를 들어 다음 쿼리는 First, MiddleLast 이름이 포함된 복합 요소 EmpName으로 표현되는 이름을 반환합니다.

SELECT EmployeeID "@EmpID",
       FirstName  "EmpName/First",
       MiddleName "EmpName/Middle",
       LastName   "EmpName/Last"
FROM   HumanResources.Employee E, Person.Contact C
WHERE  E.EmployeeID = C.ContactID  AND
       E.EmployeeID = 1
FOR XML PATH;

열 이름은 PATH 모드에서 XML을 생성하는 경로로 사용됩니다. 직원 ID 값이 포함된 열 이름은 '@' 기호로 시작합니다. 따라서 EmpID 특성이 row 요소에 추가됩니다. 다른 모든 열에는 계층을 나타내는 열 이름에 슬래시 기호(/)가 있습니다. 결과 XML는 row 요소 아래에 EmpName 자식이 있고, EmpName 자식은 First, MiddleLast 요소 자식을 갖습니다.

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
    <Last>Achong</Last>
  </EmpName>
</row>

직원 중간 이름은 null이며 기본적으로 null 값은 요소나 특성이 없음을 의미합니다. NULL 값에 대해 요소를 생성하려면 이 쿼리와 같이 XSINIL을 사용하여 ELEMENTS 지시어를 지정하면 됩니다.

SELECT EmployeeID "@EmpID",
       FirstName  "EmpName/First",
       MiddleName "EmpName/Middle",
       LastName   "EmpName/Last"
FROM   HumanResources.Employee E, Person.Contact C
WHERE  E.EmployeeID = C.ContactID  AND
       E.EmployeeID = 1
FOR XML PATH, ELEMENTS XSINIL;

다음은 결과입니다.

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      EmpID="1">
  <EmpName>
    <First>Gustavo</First>
    <Middle xsi:nil="true" />
    <Last>Achong</Last>
  </EmpName>
</row>

기본적으로 PATH 모드는 요소 중심 XML을 생성합니다. 따라서 PATH 모드 쿼리에서 ELEMENTS 지시어를 지정해도 영향이 없습니다. 그러나 이전 예시와 같이 ELEMENTS 지시어는 XSINIL에서 null 값에 대한 요소를 생성하는 데 유용합니다.

ID 및 이름 외에도 다음 쿼리는 직원 주소를 검색합니다. 주소 열에 대한 열 이름의 경로에 따라 Address 요소 자식이 row 요소에 추가되고 주소 세부 정보가 Address 요소의 요소 자식으로 추가됩니다.

SELECT EmployeeID   "@EmpID",
       FirstName    "EmpName/First",
       MiddleName   "EmpName/Middle",
       LastName     "EmpName/Last",
       AddressLine1 "Address/AddrLine1",
       AddressLine2 "Address/AddrLIne2",
       City         "Address/City"
FROM   HumanResources.Employee E,
       Person.Contact C,
       Person.Address A
WHERE  E.EmployeeID = C.ContactID
AND    E.AddressID = A.AddressID
AND    E.EmployeeID = 1
FOR XML PATH;

다음은 결과입니다.

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
    <Last>Achong</Last>
  </EmpName>
  <Address>
    <AddrLine1>7726 Driftwood Drive</AddrLine1>
    <City>Monroe</City>
  </Address>
</row>

여러 열이 동일한 경로 접두사를 공유합니다.

여러 후속 열이 동일한 경로 접두사를 공유하는 경우 동일한 이름으로 그룹화됩니다. 서로 다른 네임스페이스 접두사를 사용하면 같은 네임스페이스로 바인딩되더라도 경로가 다르다고 간주됩니다. 이전 쿼리에서 FirstName, MiddleNameLastName 열은 동일한 EmpName 접두사를 공유하므로 EmpName 요소의 자식으로 추가됩니다. 이전 예시에서 Address 요소를 만들 때도 마찬가지입니다.

한 열의 이름이 다릅니다.

이름이 다른 열이 중간에 나타나면 다음의 수정된 쿼리와 같이 그룹화가 중단됩니다. 쿼리는 이전 쿼리에 지정된 대로 FirstName 열과 MiddleName 열 사이에 주소 열을 추가하여 LastName, FirstNameMiddleName 그룹화가 중단됩니다.

SELECT EmployeeID "@EmpID",
       FirstName "EmpName/First",
       AddressLine1 "Address/AddrLine1",
       AddressLine2 "Address/AddrLIne2",
       City "Address/City",
       MiddleName "EmpName/Middle",
       LastName "EmpName/Last"
FROM   HumanResources.EmployeeAddress E,
       Person.Contact C,
       Person.Address A
WHERE  E.EmployeeID = C.ContactID
AND    E.AddressID = A.AddressID
AND    E.EmployeeID = 1
FOR XML PATH;

결과적으로 쿼리는 두 개의 EmpName 요소를 만듭니다. 첫 번째 EmpName 요소는 FirstName 요소 자식을 포함하고 두 번째 EmpName 요소는 MiddleNameLastName 요소 자식을 포함합니다.

다음은 결과입니다.

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
  </EmpName>
  <Address>
    <AddrLine1>7726 Driftwood Drive</AddrLine1>
    <City>Monroe</City>
  </Address>
  <EmpName>
    <Last>Achong</Last>
  </EmpName>
</row>

참고 항목