중첩 FOR XML 쿼리를 사용하여 XML 형성
적용 대상:SQL Server
Azure SQL 데이터베이스
Azure SQL Managed Instance
다음 예제에서는 Production.Product
테이블을 쿼리하여 특정 제품의 ListPrice
및 StandardCost
값을 검색합니다. 쿼리를 흥미롭게 만들기 위해 두 가격이 <Price>
요소에 반환되고 각 <Price>
요소에 PriceType
특성이 있습니다.
예시
XML의 예상 셰이프는 다음과 같습니다.
<xsd:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet2" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="Production.Product" type="xsd:anyType" />
</xsd:schema>
<Production.Product xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2" ProductID="520">
<Price xmlns="" PriceType="ListPrice">133.34</Price>
<Price xmlns="" PriceType="StandardCost">98.77</Price>
</Production.Product>
중첩 FOR XML 쿼리입니다.
USE AdventureWorks2022;
GO
SELECT Product.ProductID,
(SELECT 'ListPrice' as PriceType,
CAST(CAST(ListPrice as NVARCHAR(40)) as XML)
FROM Production.Product Price
WHERE Price.ProductID=Product.ProductID
FOR XML AUTO, TYPE),
(SELECT 'StandardCost' as PriceType,
CAST(CAST(StandardCost as NVARCHAR(40)) as XML)
FROM Production.Product Price
WHERE Price.ProductID=Product.ProductID
FOR XML AUTO, TYPE)
FROM Production.Product
WHERE ProductID=520
for XML AUTO, TYPE, XMLSCHEMA;
이전 쿼리의 다음 사항에 유의하세요:
외부 SELECT 문은
<Product>
특성과 두 개의 자식 요소가 있는<Price>
요소를 생성합니다.두 개의 내부 SELECT 문은 각각
<Price>
특성과 제품 가격을 반환하는 XML을 사용하여 두 요소를 구성합니다.바깥쪽 SELECT문의 XMLSCHEMA 지시문은 결과 XML의 형태를 설명하는 인라인 XSD 스키마를 생성합니다.
쿼리를 흥미롭게 만들려면 다음 쿼리와 같이 FOR XML 쿼리를 작성한 다음 결과에 대해 XQuery를 작성하여 XML을 재구성할 수 있습니다.
SELECT ProductID,
( SELECT p2.ListPrice, p2.StandardCost
FROM Production.Product p2
WHERE Product.ProductID = p2.ProductID
FOR XML AUTO, ELEMENTS XSINIL, type ).query('
for $p in /p2/*
return
<Price PriceType = "{local-name($p)}">
{ data($p) }
</Price>
')
FROM Production.Product
WHERE ProductID = 520
FOR XML AUTO, TYPE;
이전 예에서는 query()
데이터 형식의 메서드를 사용하여 내부 FOR XML 쿼리에 의해 반환된 XML을 쿼리하고 예상된 결과를 생성합니다.
다음은 결과입니다.
<Production.Product ProductID="520">
<Price PriceType="ListPrice">133.3400</Price>
<Price PriceType="StandardCost">98.7700</Price>
</Production.Product>