Exemplo: construir irmãos com o modo EXPLICIT
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
Assuma que você quer construir XML que forneça informações de pedidos de vendas. Neste exemplo, os elementos <SalesPerson>
e <OrderDetail>
são irmãos. Cada Pedido tem um elemento <OrderHeader>
, um elemento <SalesPerson>
e um ou mais elementos <OrderDetail>
.
<OrderHeader SalesOrderID=... OrderDate=... CustomerID=... >
<SalesPerson SalesPersonID=... />
<OrderDetail SalesOrderID=... LineTotal=... ProductID=... OrderQty=... />
<OrderDetail SalesOrderID=... LineTotal=... ProductID=... OrderQty=.../>
...
</OrderHeader>
<OrderHeader ...</OrderHeader>
A consulta em modo EXPLICIT a seguir constrói esse XML. A consulta especifica valores Tag
de 1 para o elemento <OrderHeader>
, 2 para o elemento <SalesPerson>
e 3 para o elemento <OrderDetail>
. Como <SalesPerson>
e <OrderDetail>
são irmãos, a consulta especifica o mesmo valor de marca Parent
de 1 identificando o elemento <OrderHeader>
.
USE AdventureWorks2022;
GO
SELECT 1 as Tag,
0 as Parent,
SalesOrderID as [OrderHeader!1!SalesOrderID],
OrderDate as [OrderHeader!1!OrderDate],
CustomerID as [OrderHeader!1!CustomerID],
NULL as [SalesPerson!2!SalesPersonID],
NULL as [OrderDetail!3!SalesOrderID],
NULL as [OrderDetail!3!LineTotal],
NULL as [OrderDetail!3!ProductID],
NULL as [OrderDetail!3!OrderQty]
FROM Sales.SalesOrderHeader
WHERE SalesOrderID=43659 or SalesOrderID=43661
UNION ALL
SELECT 2 as Tag,
1 as Parent,
SalesOrderID,
NULL,
NULL,
SalesPersonID,
NULL,
NULL,
NULL,
NULL
FROM Sales.SalesOrderHeader
WHERE SalesOrderID=43659 or SalesOrderID=43661
UNION ALL
SELECT 3 as Tag,
1 as Parent,
SOD.SalesOrderID,
NULL,
NULL,
SalesPersonID,
SOH.SalesOrderID,
LineTotal,
ProductID,
OrderQty
FROM Sales.SalesOrderHeader SOH,Sales.SalesOrderDetail SOD
WHERE SOH.SalesOrderID = SOD.SalesOrderID
AND (SOH.SalesOrderID=43659 or SOH.SalesOrderID=43661)
ORDER BY [OrderHeader!1!SalesOrderID], [SalesPerson!2!SalesPersonID],
[OrderDetail!3!SalesOrderID],[OrderDetail!3!LineTotal]
FOR XML EXPLICIT;
Este é o resultado parcial:
<OrderHeader SalesOrderID="43659" OrderDate="2005-07-01T00:00:00" CustomerID="676">
<SalesPerson SalesPersonID="279" />
<OrderDetail SalesOrderID="43659" LineTotal="10.373000" ProductID="712" OrderQty="2" />
<OrderDetail SalesOrderID="43659" LineTotal="28.840400" ProductID="716" OrderQty="1" />
<OrderDetail SalesOrderID="43659" LineTotal="34.200000" ProductID="709" OrderQty="6" />
...
</OrderHeader>
<OrderHeader SalesOrderID="43661" OrderDate="2005-07-01T00:00:00" CustomerID="442">
<SalesPerson SalesPersonID="282" />
<OrderDetail SalesOrderID="43661" LineTotal="20.746000" ProductID="712" OrderQty="4" />
<OrderDetail SalesOrderID="43661" LineTotal="40.373000" ProductID="711" OrderQty="2" />
...
</OrderHeader>