예: PATH 모드 사용
적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
다음 예제에서는 SELECT 쿼리에서 XML을 생성하는 데 PATH 모드를 사용하는 방법을 보여 줍니다. 이러한 쿼리는 대부분 ProductModel 테이블의 Instructions 열에 저장된 자전거 제조 지침 XML 문서에 대해 지정됩니다.
PATH 모드 쿼리 지정
이 쿼리는 FOR XML PATH 모드를 지정합니다.
USE AdventureWorks2022;
GO
SELECT
ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH;
GO
다음 결과는 결과 행 집합의 각 열 값이 요소에 래핑되는 요소 중심 XML입니다. 절에서 SELECT
열 이름에 대한 별칭을 지정하지 않으므로 생성된 자식 요소 이름은 절의 해당 열 이름과 SELECT
동일합니다. 행 집합의 각 행에 대해 태그가 <row>
추가됩니다.
<row>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</row>
<row>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</row>
다음 결과는 지정된 옵션이 있는 RAW
모드 쿼리와 ELEMENTS
동일합니다. 결과 집합의 각 행에 대한 기본 <row>
요소가 있는 요소 중심 XML을 반환합니다.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML RAW, ELEMENTS;
필요에 따라 행 요소 이름을 지정하여 기본값 <row>
을 덮어쓸 수 있습니다. 예를 들어 다음 쿼리는 행 집합의 <ProductModel>
각 행에 대한 요소를 반환합니다.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModel');
GO
결과 XML은 지정된 행 요소 이름을 갖습니다.
<ProductModel>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</ProductModel>
<ProductModel>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</ProductModel>
길이가 0인 문자열을 지정하면 래핑 요소가 생성되지 않습니다.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('');
GO
결과는 다음과 같습니다.
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
XPath와 유사한 열 이름 지정
다음 쿼리 ProductModelID
에서 지정된 열 이름은 '@'로 시작하고 슬래시 표시('/')를 포함하지 않습니다. 따라서 해당 열 값이 있는 요소의 <row>
특성이 결과 XML에 만들어집니다.
USE AdventureWorks2022;
GO
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 OR ProductModelID=119
FOR XML PATH ('ProductModelData');
GO
결과는 다음과 같습니다.
<ProductModelData id="122">
<Name>All-Purpose Bike Stand</Name>
</ProductModelData>
<ProductModelData id="119">
<Name>Bike Wash</Name>
</ProductModelData>
root
에 FOR XML
옵션을 지정하여 최상위 요소 하나를 추가할 수 있습니다.
SELECT ProductModelID AS "@id",
Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML PATH ('ProductModelData'), root ('Root');
GO
계층 구조를 생성하려면 PATH와 유사한 구문을 포함할 수 있습니다. 예를 들어 열의 열 이름을 Name
"SomeChild/ModelName"으로 변경하면 이 결과와 같이 계층 구조로 XML을 가져옵니다.
<Root>
<ProductModelData id="122">
<SomeChild>
<ModelName>All-Purpose Bike Stand</ModelName>
</SomeChild>
</ProductModelData>
<ProductModelData id="119">
<SomeChild>
<ModelName>Bike Wash</ModelName>
</SomeChild>
</ProductModelData>
</Root>
다음 쿼리는 제품 모델 ID 및 이름 외에도 제품 모델의 제조 명령 위치를 검색합니다. 명령 열은 xml 형식이므로 xml 데이터 형식의 메서드는 위치를 검색 query()
하도록 지정됩니다.
SELECT ProductModelID AS "@id",
Name,
Instructions.query('declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/MI:root/MI:Location
') AS ManuInstr
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH ('ProductModelData'), root ('Root');
GO
부분 결과입니다. 쿼리는 ManuInstr을 열 이름으로 지정하므로 메서드에서 반환된 query()
XML은 다음과 같이 태그로 <ManuInstr>
래핑됩니다.
<Root>
<ProductModelData id="7">
<Name>HL Touring Frame</Name>
<ManuInstr>
<MI:Location xmlns:MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
<MI:step>...</MI:step>...
</MI:Location>
...
</ManuInstr>
</ProductModelData>
</Root>
이전 FOR XML 쿼리에서는 해당 및 <ProductModelData>
요소에 대한 네임스페이 <Root>
스를 포함할 수 있습니다. 먼저 WITH XMLNAMESPACES를 사용하고 FOR XML 쿼리에서 접두사를 사용하여 네임스페이스 바인딩에 접두사를 정의하여 이 작업을 수행할 수 있습니다. 자세한 내용은 WITH XMLNAMESPACES를 사용하여 쿼리에 네임스페이스 추가를 참조하세요.
USE AdventureWorks2022;
GO
WITH XMLNAMESPACES (
'uri1' AS ns1,
'uri2' AS ns2,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions' as MI)
SELECT ProductModelID AS "ns1:ProductModelID",
Name AS "ns1:Name",
Instructions.query('
/MI:root/MI:Location
')
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH ('ns2:ProductInfo'), root('ns1:root');
GO
MI
접두사는 .에 정의되어 WITH XMLNAMESPACES
있습니다. 따라서 query()
지정된 xml 형식의 메서드는 쿼리 프롤로그에 접두사를 정의하지 않습니다. 결과는 다음과 같습니다.
<ns1:root xmlns:MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" xmlns="uri2" xmlns:ns2="uri2" xmlns:ns1="uri1">
<ns2:ProductInfo>
<ns1:ProductModelID>7</ns1:ProductModelID>
<ns1:Name>HL Touring Frame</ns1:Name>
<MI:Location xmlns:MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" LaborHours="2.5" LotSize="100" MachineHours="3" SetupHours="0.5" LocationID="10" xmlns="">
<MI:step>
Insert <MI:material>aluminum sheet MS-2341</MI:material> into the <MI:tool>T-85A framing tool</MI:tool>.
</MI:step>
...
</MI:Location>
...
</ns2:ProductInfo>
</ns1:root>
PATH 모드를 사용하여 값 목록 생성
각 제품 모델에 대해 이 쿼리는 제품 ID의 값 목록을 생성합니다. 각 제품 ID에 대해 쿼리는 이 XML 조각에 표시된 대로 중첩된 요소도 생성합니다 <ProductName>
.
<ProductModelData ProductModelID="7" ProductModelName="..." ProductIDs="product id list in the product model">
<ProductName>...</ProductName>
<ProductName>...</ProductName>
...
</ProductModelData>
원하는 XML을 생성하는 쿼리입니다.
USE AdventureWorks2022;
GO
SELECT ProductModelID AS "@ProductModelID",
Name AS "@ProductModelName",
(SELECT ProductID AS "data()"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')) AS "@ProductIDs",
(SELECT Name AS "ProductName"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')) AS "ProductNames"
FROM Production.ProductModel
WHERE ProductModelID= 7 or ProductModelID=9
FOR XML PATH('ProductModelData');
이전 쿼리의 다음 사항에 유의하세요.
첫 번째 중첩은
SELECT
열 이름으로 사용하여data()
ProductID 목록을 반환합니다. 쿼리는 빈 문자열을 행 요소 이름으로FOR XML PATH
지정하므로 요소가 생성되지 않습니다. 대신 값 목록이 특성에ProductID
할당됩니다.두 번째 중첩은
SELECT
제품 모델의 제품에 대한 제품 이름을 검색합니다. 쿼리가<ProductName>
열 이름으로 지정하기 때문에 요소에<ProductNames>
래핑된 상태로 반환되는 요소를 생성합니다ProductNames
.
다음은 부분 결과입니다.
<ProductModelData PId="7" ProductModelName="HL Touring Frame" ProductIDs="885 887 ...">
<ProductNames>
<ProductName>HL Touring Frame - Yellow, 60</ProductName>
<ProductName>HL Touring Frame - Yellow, 46</ProductName>
</ProductNames>
...
</ProductModelData>
<ProductModelData PId="9" ProductModelName="LL Road Frame" ProductIDs="722 723 724 ...">
<ProductNames>
<ProductName>LL Road Frame - Black, 58</ProductName>
<ProductName>LL Road Frame - Black, 60</ProductName>
<ProductName>LL Road Frame - Black, 62</ProductName>
...
</ProductNames>
</ProductModelData>
제품 이름을 생성하는 하위 쿼리는 결과를 엔터티화된 문자열로 반환한 다음 XML에 추가합니다. type 지시어 FOR XML PATH (''), type
을 추가하면 하위 쿼리가 xml 유형으로 결과를 반환하며 수정되지 않습니다.
USE AdventureWorks2022;
GO
SELECT ProductModelID AS "@ProductModelID",
Name AS "@ProductModelName",
(SELECT ProductID AS "data()"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')
) AS "@ProductIDs",
(
SELECT Name AS "ProductName"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH (''), type
) AS "ProductNames"
FROM Production.ProductModel
WHERE ProductModelID= 7 OR ProductModelID=9
FOR XML PATH('ProductModelData');
결과 XML에 네임스페이스 추가
WITH XMLNAMESPACES를 사용하여 네임스페이스 추가에 설명된 대로 WITH XMLNAMESPACES를 사용하여 PATH 모드 쿼리에 네임스페이스를 포함할 수 있습니다. 예를 들어 SELECT 절에 지정된 이름에는 네임스페이스 접두사가 포함됩니다. 다음 PATH
모드 쿼리는 네임스페이스를 사용하여 XML을 생성합니다.
SELECT 'en' as "English/@xml:lang",
'food' as "English",
'ger' as "German/@xml:lang",
'Essen' as "German"
FOR XML PATH ('Translation')
GO
@xml:lang
요소에 추가된 <English>
특성은 미리 정의된 xml 네임스페이스에 정의됩니다.
결과는 다음과 같습니다.
<Translation>
<English xml:lang="en">food</English>
<German xml:lang="ger">Essen</German>
</Translation>
다음 쿼리는 XML 결과에 네임스페이스를 포함하는 데 사용 WITH XMLNAMESPACES
한다는 점을 제외하고 예제 C와 유사합니다. 자세한 내용은 WITH XMLNAMESPACES를 사용하여 쿼리에 네임스페이스 추가를 참조하세요.
USE AdventureWorks2022;
GO
WITH XMLNAMESPACES ('uri1' AS ns1, DEFAULT 'uri2')
SELECT ProductModelID AS "@ns1:ProductModelID",
Name AS "@ns1:ProductModelName",
(SELECT ProductID AS "data()"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH ('')
) AS "@ns1:ProductIDs",
(
SELECT ProductID AS "@ns1:ProductID",
Name AS "@ns1:ProductName"
FROM Production.Product
WHERE Production.Product.ProductModelID =
Production.ProductModel.ProductModelID
FOR XML PATH , type
) AS "ns1:ProductNames"
FROM Production.ProductModel
WHERE ProductModelID= 7 OR ProductModelID=9
FOR XML PATH('ProductModelData'), root('root');
결과는 다음과 같습니다.
<root xmlns="uri2"
xmlns:ns1="uri1">
<ProductModelData ns1:ProductModelID="7" ns1:ProductModelName="HL Touring Frame" ns1:ProductIDs="885 887 888 889 890 891 892 893">
<ns1:ProductNames>
<row xmlns="uri2" xmlns:ns1="uri1" ns1:ProductID="885" ns1:ProductName="HL Touring Frame - Yellow, 60" />
<row xmlns="uri2" xmlns:ns1="uri1" ns1:ProductID="887" ns1:ProductName="HL Touring Frame - Yellow, 46" />
...
</ns1:ProductNames>
</ProductModelData>
<ProductModelData ns1:ProductModelID="9" ns1:ProductModelName="LL Road Frame" ns1:ProductIDs="722 723 724 725 726 727 728 729 730 736 737 738">
<ns1:ProductNames>
<row xmlns="uri2" xmlns:ns1="uri1" ns1:ProductID="722" ns1:ProductName="LL Road Frame - Black, 58" />
...
</ns1:ProductNames>
</ProductModelData>
</root>
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기