Partilhar via


Exemplos: Usar o modo AUTO

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase 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 nome Col#&2 da tabela é codificado como _x0023_ in the DBOJBECT URL.

Consulte também