Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Os exemplos seguintes ilustram a utilização do modo AUTO. Muitas destas consultas são especificadas em relação a documentos XML de instruções de fabrico de bicicletas, que são armazenados na coluna Instruções da tabela ProductModel na base de dados de exemplo AdventureWorks2025.
Exemplo: Recuperar informações de clientes, encomendas e detalhes de encomendas
Esta consulta recolhe informações de clientes, encomendas e detalhes de encomenda para um cliente específico.
USE AdventureWorks2022;
GO
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
Detail.SalesOrderID, Detail.LineTotal, Detail.ProductID,
Product.Name,
Detail.OrderQty
FROM Sales.Customer AS Cust
INNER JOIN Sales.SalesOrderHeader AS OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
INNER JOIN Sales.SalesOrderDetail AS Detail
ON OrderHeader.SalesOrderID = Detail.SalesOrderID
INNER JOIN Production.Product AS Product
ON Product.ProductID = Detail.ProductID
WHERE Cust.CustomerID IN (29672, 29734)
ORDER BY OrderHeader.CustomerID,
OrderHeader.SalesOrderID
FOR XML AUTO;
Como a consulta identifica, Cust, OrderHeaderDetail, , e Product os aliases de tabela, os elementos correspondentes são gerados pelo AUTO modo. Mais uma vez, a ordem em que as tabelas são identificadas pelas colunas especificadas na SELECT cláusula determina a hierarquia desses elementos.
Este é o resultado parcial.
<Cust CustomerID="29672">
<OrderHeader CustomerID="29672" SalesOrderID="43660">
<Detail SalesOrderID="43660" LineTotal="874.794000" ProductID="758" OrderQty="1">
<Product Name="Road-450 Red, 52" />
</Detail>
<Detail SalesOrderID="43660" LineTotal="419.458900" ProductID="762" OrderQty="1">
<Product Name="Road-650 Red, 44" />
</Detail>
</OrderHeader>
<OrderHeader CustomerID="29672" SalesOrderID="47660">
<Detail SalesOrderID="47660" LineTotal="469.794000" ProductID="765" OrderQty="1">
<Product Name="Road-650 Black, 58" />
</Detail>
</OrderHeader>
<OrderHeader CustomerID="29672" SalesOrderID="49857">
<Detail SalesOrderID="49857" LineTotal="44.994000" ProductID="852" OrderQty="1">
<Product Name="Women's Tights, S" />
</Detail>
</OrderHeader>
...
</Cust>
Exemplo: Especificar GROUP BY e funções agregadas
A consulta seguinte devolve IDs individuais dos clientes e o número de encomendas que o cliente solicitou.
USE AdventureWorks2022;
GO
SELECT C.CustomerID, COUNT(*) AS NoOfOrders
FROM Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
On C.CustomerID = SOH.CustomerID
GROUP BY C.CustomerID
FOR XML AUTO;
Este é o resultado parcial:
<I CustomerID="11000" NoOfOrders="3" />
<I CustomerID="11001" NoOfOrders="3" />
...
Exemplo: Especificar colunas calculadas em modo AUTO
Esta consulta devolve nomes individuais de clientes concatenados e a informação da encomenda. Como a coluna calculada é atribuída ao nível mais interno encontrado nesse ponto, neste exemplo, o elemento <SOH>. Os nomes de clientes concatenados são adicionados como atributos do <SOH> elemento no resultado.
USE AdventureWorks2022;
GO
SELECT P.FirstName + ' ' + P.LastName AS Name,
SOH.SalesOrderID
FROM Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
ON C.CustomerID = SOH.CustomerID
INNER JOIN Person.Person AS P
ON P.BusinessEntityID = C.PersonID
FOR XML AUTO;
Este é o resultado parcial:
<SOH Name="Jon Yang" SalesOrderID="43793" />
<SOH Name="Eugene Huang" SalesOrderID="43767" />
Para recuperar os <IndividualCustomer> elementos que têm o Name atributo que contém a informação do cabeçalho de cada ordem de venda como subelemento, a consulta é reescrita usando um sub-select. A seleção interna cria uma tabela temporária IndividualCustomer com a coluna calculada que contém os nomes dos clientes individuais. Esta tabela é então unida à SalesOrderHeader tabela para obter o resultado.
A Sales.Customer tabela armazena informações individuais do cliente, incluindo o PersonID valor para esse cliente. Isto PersonID é então usado para encontrar o nome do contacto a partir da Person.Person tabela.
SELECT IndividualCustomer.Name, SOH.SalesOrderID
FROM (SELECT FirstName+ ' '+LastName AS Name, C.PersonID, C.CustomerID
FROM Sales.Customer AS C, Person.Person AS P
WHERE C.PersonID = P.BusinessEntityID) AS IndividualCustomer
LEFT OUTER JOIN Sales.SalesOrderHeader AS SOH
ON IndividualCustomer.CustomerID = SOH.CustomerID
ORDER BY IndividualCustomer.CustomerID, SOH.CustomerID FOR XML AUTO;
Este é o resultado parcial:
<IndividualCustomer Name="Jon Yang">
<SOH SalesOrderID="43793" />
<SOH SalesOrderID="51522" />
<SOH SalesOrderID="57418" />
</IndividualCustomer>
...
Exemplo: Devolver dados binários
Esta consulta devolve uma foto do produto da ProductPhoto tabela.
ThumbNailPhoto é uma coluna varbinary(max) na ProductPhoto tabela. Por defeito, o modo AUTO devolve para os dados binários uma referência que é URL relativa à raiz virtual da base de dados onde a consulta é executada. O ProductPhotoID atributo-chave deve ser especificado para identificar a imagem. Ao recuperar uma referência de imagem, como ilustrado neste exemplo, a chave primária da tabela também deve ser especificada na SELECT cláusula para identificar de forma única uma linha.
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID = 70
FOR XML AUTO;
Este é o resultado:
<Production.ProductPhoto
ProductPhotoID="70"
ThumbNailPhoto= "dbobject/Production.ProductPhoto[@ProductPhotoID='70']/@ThumbNailPhoto" />
A mesma consulta é executada com a BINARY BASE64 opção. A consulta devolve os dados binários em formato codificado base64.
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID = 70
FOR XML AUTO, BINARY BASE64;
Este é o resultado:
<Production.ProductPhoto ProductPhotoID="70" ThumbNailPhoto="Base64 encoded photo" />
Por defeito, quando se usa o modo AUTO para recuperar dados binários, uma referência a uma URL relativa para a raiz virtual da base de dados onde a consulta foi executada será devolvida em vez dos dados binários. Isto acontecerá se a opção BINARY BASE64 não for especificada.
Quando o modo AUTO retorna uma referência URL aos dados binários em bases de dados insensíveis a maiúsculas minúsculas, onde um nome de tabela ou coluna especificado na consulta não corresponde ao nome da tabela ou coluna na base de dados, a consulta é executada. No entanto, o caso devolvido na referência não será consistente. Por exemplo:
SELECT ProductPhotoID, ThumbnailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=70
FOR XML AUTO;
Este é o resultado:
<Production.PRODUCTPHOTO
PRODUCTPHOTOID="70"
THUMBNAILPHOTO= "dbobject/Production.PRODUCTPHOTO[@ProductPhotoID='70']/@ThumbNailPhoto" />
Isto pode ser um problema particularmente quando as consultas dbobject são executadas numa base de dados sensível a maiúsculas/minúsculas. Para evitar isto, o caso do nome da tabela ou coluna especificado nas consultas deve corresponder ao caso do nome da tabela ou coluna na base de dados.
Exemplo: Compreender a codificação
Este exemplo mostra as várias codificações que ocorrem no resultado.
Crie esta tabela:
CREATE TABLE [Special Chars] (Col1 char(1) primary key, [Col#&2] varbinary(50));
Adicione os seguintes dados à tabela:
INSERT INTO [Special Chars] VALUES ('&', 0x20), ('#', 0x20);
Esta consulta devolve os dados da tabela. O modo FOR XML AUTO está especificado. Os dados binários são devolvidos como referência.
SELECT * FROM [Special Chars] FOR XML AUTO;
Este é o resultado:
<Special_x0020_Chars Col1="#"
Col_x0023__x0026_2="dbobject/Special_x0020_Chars[@Col1='#']/@Col_x0023__x0026_2"
/>
<Special_x0020_Chars Col1="&"
Col_x0023__x0026_2="dbobject/Special_x0020_Chars[@Col1='&']/@Col_x0023__x0026_2"
/>
Este é o processo para codificar caracteres especiais no resultado:
No resultado da consulta, os caracteres XML e URL especiais nos nomes dos elementos e atributos que são devolvidos são codificados usando o valor hexadecimal do carácter Unicode correspondente. No resultado anterior, o nome
<Special Chars>do elemento é devolvido como<Special_x0020_Chars>. O nome<Col#&2>do atributo é devolvido como<Col_x0023__x0026_2>. Tanto caracteres especiais XML como URL são codificados.Se os valores dos elementos ou atributos conterem qualquer uma das cinco entidades padrão de caracteres XML (', "", <, >, e &), estes caracteres XML especiais são sempre codificados usando codificação de caracteres XML. No resultado anterior, o valor
&no valor do atributo<Col1>é codificado como&. No entanto, o carácter # mantém-se #, porque é um carácter XML válido e não um carácter XML especial.Se os valores dos elementos ou atributos contiverem quaisquer caracteres URL especiais que tenham um significado especial na URL, eles são codificados apenas no valor da URL do DBOBJECT e são codificados apenas quando o carácter especial faz parte de um nome de tabela ou coluna. No resultado, o carácter
#que faz parte do nomeCol#&2da tabela é codificado como_x0023_ in the DBOJBECT URL.
Consulte também
- Usar o modo AUTO com FOR XML