Udostępnij przez


Włączenie hierarchii XQueries

Większość XML kolumny typu AdventureWorks bazy danych są półstrukturalnych dokumentów.W związku z tym dokumenty przechowywane w każdym wierszu mogą wyglądać inaczej.Próbki kwerend, w tym temacie przedstawiono sposobu wyodrębniania informacji z różnych dokumentów.

Przykłady

A.Z instrukcjami dotyczącymi produkcji dokumenty, pobrać lokalizacji środka pracy wraz z pierwszym krokiem produkcji w tych lokalizacjach

Dla modelu produktu 7 kwerendy konstrukcji XML, który zawiera <ManuInstr> element, o ProductModelID and ProductModelName atrybuty i jeden lub więcej elementów podrzędność <Location>.

Każdy <Location> element ma swój własny zestaw atrybutów, a drugi <step> element podrzędność. To <step> element podrzędność jest pierwszym krokiem produkcji w jego środku pracy.

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

Pierwszy przycisk jest przyciskiem domyślnym.

  • The namespace keyword in the XQuery Prolog defines a namespace prefix.Ten prefiks jest używany w dalszej części treści kwerendy.

  • Kontekst, tokeny, przełączanie {) i (}, są używane do przełączania kwerendy z konstrukcji XML do oceny kwerendy.

  • The sql:kolumna() is used to include a relational value in the XML that is being constructed.

  • Przy tworzeniu <Location> element $wc/@* pobiera wszystkie gniazda roboczego lokalizacji atrybuty.

  • The ciąg() funkcja returns the ciąg value from the <step> element.

Jest to wynik częściowy:

<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.kolumna AdditionalContactInfo znaleźć wszystkie numery telefonów

Następująca kwerenda pobiera numery telefonów dodatkowe dla określonego odbiorcy kontaktu poprzez przeszukiwanie całej hierarchii dla <telephoneNumber> element. Ponieważ <telephoneNumber> element może pojawiać się w dowolnym miejscu w hierarchii, w kwerendzie użyto operator elementów podrzędnych i samodzielnie (/ /) do wyszukiwania.

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

To jest wynik:

<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>

Aby pobrać tylko numery telefonów najwyższego poziom, w szczególności <telephoneNumber> elementy podrzędność <AdditionalContactInfo>, dla wyrażenie w kwerendzie zmieni się na

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