Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O exemplo a seguir mostra como gerar irmãos usando uma consulta aninhada do modo AUTO. A única outra maneira de gerar esse XML é usar o modo EXPLICIT. No entanto, isso pode ser complicado.
Exemplo
Essa consulta constrói XML que fornece informações sobre pedidos de vendas. Isso inclui o seguinte:
Informações do cabeçalho do pedido de vendas,
SalesOrderID,SalesPersonIDeOrderDate. AdventureWorks2012 armazena essas informações naSalesOrderHeadertabela.Informações detalhadas do pedido de venda. Isso inclui um ou mais produtos pedidos, o preço unitário e a quantidade ordenada. Essas informações são armazenadas na
SalesOrderDetailtabela.Informações de vendedor. Este é o vendedor que fez o pedido. A tabela
SalesPersonfornece oSalesPersonID. Para essa consulta, você precisa unir essa tabela àEmployeetabela para encontrar o nome do vendedor.
As duas consultas distintas SELECT a seguir geram XML com uma pequena diferença na forma.
A primeira consulta gera XML no qual <SalesPerson> e>SalesOrderHeader< aparecem como filhos irmãos de:<SalesOrder>
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
Na consulta prévia, a instrução mais externa SELECT faz o seguinte:
Consulta o conjunto de linhas
SalesOrder, especificado na cláusulaFROM. O resultado é um XML com um ou mais <SalesOrder> elementos.Especifica o
AUTOmodo e aTYPEdiretiva.AUTOO modo transforma o resultado da consulta em XML, e aTYPEdiretiva retorna o resultado como tipoxml.Inclui duas declarações aninhadas
SELECT, separadas por uma vírgula. A primeira declaração aninhadaSELECTrecupera informações do pedido de vendas, incluindo cabeçalho e detalhes, e a segunda declaração aninhadaSELECTrecupera informações do vendedor.- A instrução
SELECTque recuperaSalesOrderID,SalesPersonIDeCustomerIDpor si só inclui outra instrução aninhadaSELECT ... FOR XML(com modoAUTOe diretivaTYPE) que retorna informações detalhadas do pedido de vendas.
- A instrução
A instrução SELECT que recupera as informações do vendedor consulta um conjunto de linhas, SalesPerson, criado na cláusula FROM. Para que as consultas FOR XML funcionem, você deve fornecer um nome para o conjunto de linhas anônimo gerado na cláusula FROM. Nesse caso, o nome fornecido é SalesPerson.
Este é o resultado parcial:
<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>
...
A consulta a seguir gera as mesmas informações de pedido de vendas, exceto que no XML resultante, o <SalesPerson> aparece como um irmão de <SalesOrderDetail>:
<SalesOrder>
<SalesOrderHeader ...>
<SalesOrderDetail .../>
<SalesOrderDetail .../>
...
<SalesPerson .../>
</SalesOrderHeader>
</SalesOrder>
<SalesOrder>
...
</SalesOrder>
Esta é a consulta:
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
Este é o resultado:
<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>
Como a TYPE diretiva retorna um resultado de consulta como xml tipo, você pode consultar o XML resultante usando vários xml métodos de tipo de dados. Para obter mais informações, consulte métodos de tipo de dados xml. Na consulta a seguir, observe o seguinte:
A consulta anterior é adicionada à
FROMcláusula. O resultado da consulta é retornado como uma tabela. Observe o aliasXmlColadicionado.A
SELECTcláusula especifica um XQuery em relação aoXmlColretornado naFROMcláusula. Oquery()método doxmltipo de dados é usado na especificação do XQuery. Para obter mais informações, consulte o método query() (tipo de dados xml).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)