중첩 AUTO 모드 쿼리를 사용하여 형제 생성
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
다음 예에서는 중첩된 AUTO 모드 쿼리를 사용하여 형제를 생성하는 방법을 보여 줍니다. 이러한 XML을 생성하는 다른 방법은 EXPLICIT 모드를 사용하는 것 뿐입니다. 그러나 이 작업은 번거로울 수 있습니다.
예시
이 쿼리는 판매 주문 정보를 제공하는 XML을 생성합니다. 여기에는 다음과 같은 사항이 포함됩니다.
판매 주문 헤더 정보,
SalesOrderID
,SalesPersonID
및OrderDate
가 포함됩니다.AdventureWorks2022
에서는 이 정보를SalesOrderHeader
테이블에 저장합니다.판매 주문 세부 정보. 여기에는 주문된 하나 이상의 제품, 단가 및 주문된 수량이 포함됩니다. 이 정보는
SalesOrderDetail
테이블에 저장됩니다.판매 개인 정보. 이것은 주문을 받은 영업 직원입니다.
SalesPerson
테이블은SalesPersonID
를 제공합니다. 이 쿼리에서는 판매 직원 이름을 찾기 위해 이 테이블을Employee
테이블에 조인해야 합니다.
다음과 같은 두 개의 고유 SELECT
는 모양이 약간 다른 XML을 생성합니다.
첫 번째 쿼리는 <SalesPerson>
의 형제 자식으로 <SalesOrderHeader>
및 <SalesOrder>
가 표시되는 XML을 생성합니다.
SELECT
(SELECT top 2 SalesOrderID, SalesPersonID, CustomerID,
(select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice
from Sales.SalesOrderDetail
WHERE SalesOrderDetail.SalesOrderID =
SalesOrderHeader.SalesOrderID
FOR XML AUTO, TYPE)
FROM Sales.SalesOrderHeader
WHERE SalesOrderHeader.SalesOrderID = SalesOrder.SalesOrderID
for xml auto, type),
(SELECT *
FROM (SELECT SalesPersonID, EmployeeID
FROM Sales.SalesPerson, HumanResources.Employee
WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As
SalesPerson
WHERE SalesPerson.SalesPersonID = SalesOrder.SalesPersonID
FOR XML AUTO, TYPE)
FROM (SELECT SalesOrderHeader.SalesOrderID, SalesOrderHeader.SalesPersonID
FROM Sales.SalesOrderHeader, Sales.SalesPerson
WHERE SalesOrderHeader.SalesPersonID = SalesPerson.SalesPersonID
) as SalesOrder
ORDER BY SalesOrder.SalesOrderID
FOR XML AUTO, TYPE;
이전 쿼리에서 가장 바깥쪽 SELECT
문은 다음을 수행합니다.
SalesOrder
절에 지정된FROM
행 집합을 쿼리합니다. 결과는 하나 이상의<SalesOrder>
요소가 있는 XML입니다.AUTO
모드 및TYPE
지시어를 지정합니다.AUTO
모드는 쿼리 결과를 XML로 변환하고TYPE
지시문은 결과를 xml 형식으로 반환합니다.쉼표로 구분된 두 개의 중첩
SELECT
문을 포함합니다. 첫 번째 중첩된SELECT
는 판매 주문 정보, 헤더 및 세부 정보를 검색하고 두 번째 중첩된SELECT
문은 판매 직원 정보를 검색합니다.SELECT
,SalesOrderID
및SalesPersonID
를 검색하는CustomerID
문에는 판매 주문 세부 정보 정보를 반환하는 또 다른 중첩SELECT ... FOR XML
문(AUTO
모드 및TYPE
지시문 포함)이 포함됩니다.
영업 사원 정보를 검색하는 SELECT
문은 SalesPerson
절에서 만든 FROM
행 집합을 쿼리합니다. FOR XML
쿼리가 작동하려면 FROM
절에서 생성된 익명 행 집합에 이름을 제공해야 합니다. 이 경우, 제공된 이름은 SalesPerson
입니다.
다음은 결과의 일부입니다.
<SalesOrder>
<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />
</Sales.SalesOrderHeader>
<SalesPerson SalesPersonID="279" EmployeeID="279" />
</SalesOrder>
...
다음 쿼리는 결과 XML에서 <SalesPerson>
의 형제로 <SalesOrderDetail>
이 나타나는 것을 제외하고 동일한 판매 주문 정보를 생성합니다.
<SalesOrder>
<SalesOrderHeader ...>
<SalesOrderDetail .../>
<SalesOrderDetail .../>
...
<SalesPerson .../>
</SalesOrderHeader>
</SalesOrder>
<SalesOrder>
...
</SalesOrder>
다음은 쿼리입니다.
SELECT SalesOrderID, SalesPersonID, CustomerID,
(select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice
from Sales.SalesOrderDetail
WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID
FOR XML AUTO, TYPE),
(SELECT *
FROM (SELECT SalesPersonID, EmployeeID
FROM Sales.SalesPerson, HumanResources.Employee
WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson
WHERE SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID
FOR XML AUTO, TYPE)
FROM Sales.SalesOrderHeader
WHERE SalesOrderID=43659 or SalesOrderID=43660
FOR XML AUTO, TYPE;
다음은 결과입니다.
<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />
<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />
<SalesPerson SalesPersonID="279" EmployeeID="279" />
</Sales.SalesOrderHeader>
<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="117">
<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />
<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />
<SalesPerson SalesPersonID="279" EmployeeID="279" />
</Sales.SalesOrderHeader>
TYPE
지시어는 쿼리 결과를 xml 유형으로 반환하기 때문에 여러 xml 데이터 형식 메서드를 사용하여 결과 XML을 쿼리할 수 있습니다. 자세한 내용은 xml 데이터 형식 메서드를 참조하세요. 다음 쿼리에서 다음에 유의하세요.
이전 쿼리가
FROM
절에 추가됩니다. 쿼리 결과는 테이블로 반환됩니다. 추가된XmlCol
별칭을 확인합니다.SELECT
절은XmlCol
절에서 반환된 XQuery를FROM
에 대해 지정합니다. xml 데이터 형식의query()
메서드는 XQuery를 지정하는 데 사용됩니다. 자세한 내용은 query() 메서드 (xml Data Type)를 참조하세요.SELECT XmlCol.query('<Root> { /* } </Root>') FROM ( SELECT SalesOrderID, SalesPersonID, CustomerID, (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice from Sales.SalesOrderDetail WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID FOR XML AUTO, TYPE), (SELECT * FROM (SELECT SalesPersonID, EmployeeID FROM Sales.SalesPerson, HumanResources.Employee WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson WHERE SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID FOR XML AUTO, TYPE) FROM Sales.SalesOrderHeader WHERE SalesOrderID='43659' or SalesOrderID='43660' FOR XML AUTO, TYPE ) as T(XmlCol);