Partilhar via


XQueries envolvendo hierarquia

Aplica-se a:SQL Server

A maioria das colunas do tipo xml no banco de dados AdventureWorks são documentos semiestruturados. Portanto, os documentos armazenados em cada linha podem parecer diferentes. Os exemplos de consulta neste tópico ilustram como extrair informações desses vários documentos.

Exemplos

Um. A partir dos documentos de instruções de fabricação, recupere os locais do centro de trabalho juntamente com a primeira etapa de fabricação nesses locais

Para o modelo de produto 7, a consulta constrói XML que inclui o elemento <ManuInstr>, com ProductModelID e atributos de ProductModelName e um ou mais elementos filho <Location>.

Cada elemento <Location> tem seu próprio conjunto de atributos e um elemento filho <step>. Este elemento filho <step> é a primeira etapa de fabricação no local do centro de trabalho.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
   \<ManuInstr  ProdModelID = "{sql:column("Production.ProductModel.ProductModelID") }"   
                ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >  
            {   
              for $wc in //AWMI:root/AWMI:Location  
              return  
                <Location>  
                 {$wc/@* }  
                 <step1> { string( ($wc//AWMI:step)[1] ) } </step1>  
                </Location>  
            }  
          </ManuInstr>  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Observe o seguinte da consulta anterior:

  • O namespace palavra-chave no XQuery Prolog define um prefixo de namespace. Esse prefixo é usado posteriormente no corpo da consulta.

  • Os tokens de comutação de contexto, {) e (}, são usados para alternar a consulta da construção XML para a avaliação da consulta.

  • O sql:column() é usado para incluir um valor relacional no XML que está sendo construído.

  • Ao construir o elemento <Location>, $wc/@* recupera todos os atributos de localização do centro de trabalho.

  • A função string() retorna o valor da cadeia de caracteres do elemento <step>.

Este é um resultado parcial:

<ManuInstr ProdModelID="7" ProductModelName="HL Touring Frame">  
   <Location LocationID="10" SetupHours="0.5"   
            MachineHours="3" LaborHours="2.5" LotSize="100">  
     <step1>Insert aluminum sheet MS-2341 into the T-85A   
             framing tool.</step1>  
   </Location>  
   <Location LocationID="20" SetupHours="0.15"   
            MachineHours="2" LaborHours="1.75" LotSize="1">  
      <step1>Assemble all frame components following   
             blueprint 1299.</step1>  
   </Location>  
...  
</ManuInstr>   

B. Encontre todos os números de telefone na coluna AdditionalContactInfo

A consulta a seguir recupera números de telefone adicionais para um contato de cliente específico pesquisando toda a hierarquia para o elemento <telephoneNumber>. Como o elemento <telephoneNumber> pode aparecer em qualquer lugar na hierarquia, a consulta usa o descendente e o autooperador (//) na pesquisa.

SELECT AdditionalContactInfo.query('  
 declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";  
 declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
for $ph in /ci:AdditionalContactInfo//act:telephoneNumber  
   return  
      $ph/act:number  
') as x  
FROM  Person.Contact  
WHERE ContactID = 1  

Este é o resultado:

\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  111-111-1111  
\</act:number>  
\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  112-111-1111  
\</act:number>  

Para recuperar apenas os números de telefone de nível superior, especificamente os elementos filho <telephoneNumber> de <AdditionalContactInfo>, a expressão FOR na consulta muda para

for $ph in /ci:AdditionalContactInfo/act:telephoneNumber.

Ver também

Noções básicas do XQuery
Construção XML (XQuery)
dados XML (SQL Server)