Partilhar via


XQueries que envolvem ordem

Bancos de dados relacionais não têm um conceito de seqüência. Por exemplo, você não pode fazer uma solicitação como "Obtenha o primeiro cliente do banco de dados". Porém, você pode consultar um documento XML e recuperar o primeiro elemento <Cliente>. Então, você sempre recuperará o mesmo cliente.

Este tópico ilustra consultas baseadas na seqüência em que os nós aparecem no documento.

Exemplos

A. Recuperar as etapas de produção no segundo local de centro de trabalho para um produto

Para um modelo de produto específico, a consulta a seguir recupera as etapas de produção no segundo centro de trabalho em uma seqüência de locais de centro de trabalho no processo de produção.

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

Observe o seguinte na consulta anterior:

  • As expressões nas chaves são substituídas pelo resultado de sua avaliação. Para obter mais informações, consulte Construção XML (XQuery).

  • @ * recupera todos os atributos do segundo local de centro de trabalho.

  • A iteração FLWOR (FOR ... RETURN) recupera todos os elementos filho <step> do segundo local de centro de trabalho.

  • A função sql:column() (XQuery) inclui o valor relacional no XML que está sendo construído.

Este é o resultado:

<ManuStep ProdModelID="7" ProductModelName="HL Touring Frame">
  <Location LocationID="20" SetupHours="0.15" 
              MachineHours="2"  LaborHours="1.75" LotSize="1">
  <Steps>
   <Step>Assemble all frame components following blueprint 1299.</Step>
     …
  </Steps>
 </Location>
</ManuStep>  

A consulta anterior recupera apenas os nós de texto. Se, do contrário, você quiser o elemento <step> inteiro seja retornado, remova a função string() da consulta:

B. Encontrar todos os materiais e as ferramentas usadas no segundo local de centro de trabalho na produção de um produto

Para um modelo de produto específico, a consulta a seguir recupera as ferramentas e os materiais usados no segundo centro de trabalho na seqüência de locais de centro de trabalho no processo de produção.

SELECT Instructions.query('
    declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
   <Location>
      { (//AWMI:root/AWMI:Location)[1]/@* }
       <Tools>
         { for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:tool
           return
              <Tool>
                { string($s) }
              </Tool>
          }
        </Tools>
        <Materials>
            { for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:material
              return
                 <Material>
                    { string($s) }
                 </Material>
             }
         </Materials>
  </Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7

Observe o seguinte na consulta anterior:

  • A consulta constrói o elemento <Location> e recupera seus valores de atributo do banco de dados.

  • Ela usa duas iterações FLWOR (for...return): uma para recuperar ferramentas e outra para recuperar o material usado.

Este é o resultado:

<Location LocationID="10" SetupHours=".5" 
          MachineHours="3" LaborHours="2.5" LotSize="100">
  <Tools>
    <Tool>T-85A framing tool</Tool>
    <Tool>Trim Jig TJ-26</Tool>
    <Tool>router with a carbide tip 15</Tool>
    <Tool>Forming Tool FT-15</Tool>
  </Tools>
  <Materials>
    <Material>aluminum sheet MS-2341</Material>
  </Materials>
</Location>

C. Recuperar as duas primeiras descrições de recurso de produto do catálogo de produtos

Para um modelo de produto específico, a consulta recupera as primeiras duas descrições do elemento <Features> do catálogo de modelo de produtos.

SELECT CatalogDescription.query('
     declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     <ProductModel ProductModelID= "{ data( (/p1:ProductDescription/@ProductModelID)[1] ) }"
                   ProductModelName = "{ data( (/p1:ProductDescription/@ProductModelName)[1] ) }" >
       {
         for $F in /p1:ProductDescription/p1:Features
         return 
           $F/*[position() <= 2] 
       }
     </ProductModel>
      ') as x
FROM Production.ProductModel
where ProductModelID=19

Observe o seguinte na consulta anterior:

O corpo da consulta constrói XML que inclui o elemento <ProductModel> que tem os atributos ProductModelID e ProductModelName.

  • A consulta usa um loop FOR... RETURN para recuperar as descrições de recurso de modelo de produto. A funçãoposition() é usada para recuperar os dois primeiros recursos.

Este é o resultado:

<ProductModel ProductModelID="19" ProductModelName="Mountain 100">
 <p1:Warranty 
  xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
  <p1:WarrantyPeriod>3 year</p1:WarrantyPeriod>
  <p1:Description>parts and labor</p1:Description>
 </p1:Warranty>
 <p2:Maintenance 
  xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
  <p2:NoOfYears>10</p2:NoOfYears>
  <p2:Description>maintenance contact available through your dealer 
            or any AdventureWorks retail store.
  </p2:Description>
 </p2:Maintenance>
</ProductModel> 

D. Encontrar as duas primeiras ferramentas usadas no primeiro local de centro de trabalho no processo de produção do produto

Para um modelo de produto, a consulta recupera as duas primeiras ferramentas no primeiro centro de trabalho na seqüência de locais de centro de trabalho no processo de produção. A consulta é especificada em relação às instruções de produção armazenadas na coluna Instructions da tabela Production.ProductModel.

SELECT Instructions.query('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
   for $Inst in (//AWMI:root/AWMI:Location)[1]
   return 
     <Location>
       { $Inst/@* }
       <Tools>
         { for $s in ($Inst//AWMI:step//AWMI:tool)[position() <= 2]
           return
             <Tool>
               { string($s) }
             </Tool>
         }
       </Tools>
     </Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7

Este é o resultado:

<Location LocationID="10" SetupHours=".5" 
            MachineHours="3" LaborHours="2.5" LotSize="100">
  <Tools>
    <Tool>T-85A framing tool</Tool>
    <Tool>Trim Jig TJ-26</Tool>
  </Tools>
</Location> 

E. Encontrar as duas últimas etapas de produção no primeiro local de centro de trabalho no processo de produção de um produto específico

A consulta usa a função last() para recuperar as duas últimas etapas de produção.

SELECT Instructions.query(' 
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
  <LastTwoManuSteps>
   <Last-1Step> 
     { (/AWMI:root/AWMI:Location)[1]/AWMI:step[(last()-1)]/text() }
   </Last-1Step>
   <LastStep> 
     { (/AWMI:root/AWMI:Location)[1]/AWMI:step[last()]/text() }
   </LastStep>
  </LastTwoManuSteps>') as Result
FROM Production.ProductModel
where ProductModelID=7

Este é o resultado:

<LastTwoManuSteps>
   <Last-1Step>When finished, inspect the forms for defects per 
               Inspection Specification .</Last-1Step>
   <LastStep>Remove the frames from the tool and place them in the 
             Completed or Rejected bin as appropriate.</LastStep>
</LastTwoManuSteps>