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.
Conforme descrito em FOR XML (SQL Server), o modo AUTO retorna os resultados da consulta como elementos XML aninhados. Isso não fornece muito controle sobre a forma do XML gerado a partir de um resultado de consulta. As consultas de modo AUTO serão úteis se você quiser gerar hierarquias simples. No entanto, usar o modo EXPLICIT com FOR XML e usar o modo PATH com FOR XML fornece mais controle e flexibilidade para decidir a forma do XML de um resultado de consulta.
Cada tabela na cláusula FROM, da qual pelo menos uma coluna está listada na cláusula SELECT, é representada como um elemento XML. As colunas listadas na cláusula SELECT serão mapeadas para atributos ou subelementos, se a opção ELEMENTS opcional for especificada na cláusula FOR XML.
A hierarquia XML, aninhamento dos elementos, no XML resultante é baseada na ordem das tabelas identificadas pelas colunas especificadas na cláusula SELECT. Portanto, a ordem na qual os nomes de coluna são especificados na cláusula SELECT é significativa. A primeira tabela mais à esquerda identificada forma o elemento superior no documento XML resultante. A segunda tabela mais à esquerda, identificada por colunas na instrução SELECT, forma um subelemento dentro do elemento superior e assim por diante.
Se um nome de coluna listado na cláusula SELECT for de uma tabela já identificada por uma coluna especificada anteriormente na cláusula SELECT, a coluna será adicionada como um atributo do elemento já criado, em vez de abrir um novo nível de hierarquia. Se a opção ELEMENTS for especificada, a coluna será adicionada como um atributo.
Por exemplo, execute esta consulta:
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO
Este é o resultado parcial:
<Cust CustomerID="1" CustomerType="S">
<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" />
</Cust>
...
Observe o seguinte na cláusula SELECT:
O CustomerID faz referência à tabela Cust. Portanto, um <
Cust> elemento é criado e CustomerID é adicionado como seu atributo.Em seguida, três colunas, OrderHeader.CustomerID, OrderHeader.SaleOrderID e OrderHeader.Status, fazem referência à tabela OrderHeader. Portanto, um <
OrderHeader> elemento é adicionado como um subelemento do>Cust< elemento e as três colunas são adicionadas como atributos de .<OrderHeader>Em seguida, a coluna Cust.CustomerType referencia novamente a tabela Cust que já foi identificada pela coluna Cust.CustomerID. Portanto, nenhum novo elemento é criado. Em vez disso, o atributo CustomerType é adicionado ao <
Cust> elemento que foi criado anteriormente.A consulta especifica aliases para os nomes de tabela. Esses aliases aparecem como nomes de elementos correspondentes.
ORDER BY é necessário para agrupar todos os filhos sob um único pai.
Essa consulta é semelhante à anterior, exceto que a cláusula SELECT especifica colunas na tabela OrderHeader antes das colunas na tabela Cust. Portanto, o primeiro <OrderHeader> elemento é criado e, em seguida, o <Cust> elemento filho é adicionado a ele.
select OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerID,
Cust.CustomerType
from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
where Cust.CustomerID = OrderHeader.CustomerID
for xml auto
Este é o resultado parcial:
<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">
<Cust CustomerID="1" CustomerType="S" />
</OrderHeader>
...
Se a opção ELEMENTS for adicionada à cláusula FOR XML, XML centrado em elemento será retornado.
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO, ELEMENTS
Este é o resultado parcial:
<Cust>
<CustomerID>1</CustomerID>
<CustomerType>S</CustomerType>
<OrderHeader>
<CustomerID>1</CustomerID>
<SalesOrderID>43860</SalesOrderID>
<Status>5</Status>
</OrderHeader>
...
</Cust>
...
Nesta consulta, os valores CustomerID são comparados de uma linha à outra na criação dos <elementos Cust> , pois CustomerID é a chave primária da tabela. Se CustomerID não for identificado como a chave primária da tabela, todos os valores de coluna (CustomerID, CustomerType nesta consulta) serão comparados de uma linha para a outra. Se os valores forem diferentes, um novo <elemento Cust> será adicionado ao XML.
Ao comparar esses valores de coluna, se qualquer uma das colunas a serem comparadas for do tipo texto, ntext, imagem ou xml, o FOR XML pressupõe que os valores são diferentes e não comparados, mesmo que sejam iguais. Isso ocorre porque não há suporte para a comparação de objetos grandes. Os elementos são adicionados ao resultado de cada linha selecionada. Observe que colunas de (n)varchar(max) e varbinary(max) são comparadas.
Quando uma coluna na cláusula SELECT não pode ser associada a nenhuma das tabelas identificadas na cláusula FROM, como no caso de uma coluna de agregação ou coluna computada, a coluna é adicionada no documento XML no nível de aninhamento mais profundo em vigor quando é encontrada na lista. Se essa coluna aparecer como a primeira coluna na cláusula SELECT, a coluna será adicionada ao elemento superior.
Se o caractere curinga asterisco (*) for especificado na cláusula SELECT, o aninhamento será determinado da mesma maneira descrita anteriormente, com base na ordem em que as linhas são retornadas pelo mecanismo de consulta.
Nesta seção
Os tópicos a seguir fornecem mais informações sobre o modo AUTO: