적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric의 SQL 데이터베이스
다음은 이름이 있는 행 집합 열이 대/소문자를 구분하여 결과 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 요소가 만들어집니다.
다음 쿼리는 결과로 열 이름을 지정합니다. 따라서 이 result 요소에 row 하위 요소가 추가됩니다.
SELECT 2 + 2 as result
for xml PATH;
다음은 결과입니다.
<row>
<result>4</result>
</row>
다음 쿼리는 ManuWorkCenterInformation 형식의 Instructions 열에 대해 지정된 XQuery에서 반환된 XML의 열 이름인 을 지정합니다. 따라서 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 요소의 특성에 매핑됩니다.
예를 들어 다음 쿼리는 EmpName, First 및 Middle 이름이 포함된 복합 요소 Last으로 표현되는 이름을 반환합니다.
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는 EmpName 요소 아래에 row 자식이 있고, EmpName 자식은 First, Middle 및 Last 요소 자식을 갖습니다.
<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, MiddleName 및 LastName 열은 동일한 EmpName 접두사를 공유하므로
EmpName 요소의 자식으로 추가됩니다. 이전 예시에서 Address 요소를 만들 때도 마찬가지입니다.
한 열의 이름이 다릅니다.
이름이 다른 열이 중간에 나타나면 다음의 수정된 쿼리와 같이 그룹화가 중단됩니다. 쿼리는 이전 쿼리에 지정된 대로 FirstName 열과 MiddleName 열 사이에 주소 열을 추가하여 LastName, FirstName 및 MiddleName 그룹화가 중단됩니다.
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 요소는 MiddleName 및 LastName 요소 자식을 포함합니다.
다음은 결과입니다.
<row EmpID="1">
<EmpName>
<First>Gustavo</First>
</EmpName>
<Address>
<AddrLine1>7726 Driftwood Drive</AddrLine1>
<City>Monroe</City>
</Address>
<EmpName>
<Last>Achong</Last>
</EmpName>
</row>