Share via


XQueries que envolvem hierarquia

A maioria das colunas do tipo xml no banco de dados AdventureWorks são documentos semi-estruturados. 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

A. Nos documentos de instrução de produção, recupere os locais de centro de trabalho junto com a primeira etapa de fabricação nesses locais

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

Cada elemento <Location> tem seu próprio conjunto de atributos e um elemento filho <step>. Esse elemento filho <step> é a primeira etapa de fabricação no local de 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 na consulta anterior:

  • A palavra-chave namespace no Prólogo do XQuery define um prefixo de namespace. Esse prefixo é usado mais tarde no corpo da consulta.

  • As chaves agem como tokens de troca de contexto,{) e (}, e são usadas para alternar a consulta da construção XML para avaliação de 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 local de 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. Localizar todos os números de telefone na coluna AdditionalContactInfo

A consulta a seguir recupera todos os números de telefone adicionais para contato de um cliente específico pesquisando a hierarquia inteira para o elemento <telephoneNumber>. Como o elemento <telephoneNumber> pode aparecer em qualquer lugar na hierarquia, a consulta usa o operador descendente e auto-operador (//) 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 é alterada para

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