다음 예에서는 중첩된 AUTO 모드 쿼리를 사용하여 형제를 생성하는 방법을 보여 줍니다. 이러한 XML을 생성하는 다른 방법은 EXPLICIT 모드를 사용하는 것 뿐입니다. 그러나 이 작업은 번거로울 수 있습니다.
예시
이 쿼리는 판매 주문 정보를 제공하는 XML을 생성합니다. 여기에는 다음과 같은 사항이 포함됩니다.
판매 주문 헤더 정보,
SalesOrderID,SalesPersonID및OrderDate가 포함됩니다. AdventureWorks2012 는SalesOrderHeader이 정보를 테이블에 저장합니다.판매 주문 세부 정보. 여기에는 주문된 하나 이상의 제품, 단가 및 주문된 수량이 포함됩니다. 이 정보는
SalesOrderDetail테이블에 저장됩니다.판매 개인 정보. 이것은 주문을 받은 영업 직원입니다.
SalesPerson테이블은SalesPersonID를 제공합니다. 이 쿼리에서는 판매 직원 이름을 찾기 위해 이 테이블을Employee테이블에 조인해야 합니다.
고유한 SELECT 쿼리 두 개가 모양에 약간의 차이가 있는 XML을 생성합니다.
첫 번째 쿼리는 <SalesOrder>의 형제 자식으로 나타나는 XML을 생성하며, 그 안에 <SalesPerson>와 <SalesOrderHeader>가 포함됩니다.
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에 대해 지정합니다.query()데이터 형식의xml메서드는 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)