Udostępnij za pośrednictwem


XQueries z udziałem hierarchii

Dotyczy:programu SQL Server

Większość kolumn xml type w bazie danych AdventureWorks to częściowo ustrukturyzowane dokumenty. W związku z tym dokumenty przechowywane w każdym wierszu mogą wyglądać inaczej. Przykłady zapytań w tym temacie ilustrują sposób wyodrębniania informacji z tych różnych dokumentów.

Przykłady

A. Z dokumentów dotyczących instrukcji produkcyjnych pobierz lokalizacje centrum roboczego wraz z pierwszym krokiem produkcji w tych lokalizacjach

W przypadku modelu produktu 7 zapytanie tworzy kod XML zawierający element <ManuInstr> z ProductModelID i atrybutami ProductModelName oraz co najmniej jednym elementem podrzędnym <Location>.

Każdy element <Location> ma własny zestaw atrybutów i jeden element podrzędny <step>. Ten element podrzędny <step> jest pierwszym krokiem produkcyjnym w lokalizacji centrum 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  

Zwróć uwagę na następujące elementy z poprzedniego zapytania:

  • Słowo kluczowe przestrzeni nazw w XQuery Prolog definiuje prefiks przestrzeni nazw. Ten prefiks jest używany w dalszej części treści zapytania.

  • Tokeny przełączania kontekstu, {) i (}, są używane do przełączania zapytania z konstrukcji XML na ocenę zapytania.

  • sql:column() służy do uwzględnienia wartości relacyjnej w tworzonym pliku XML.

  • Podczas konstruowania elementu <Location> $wc/@* pobiera wszystkie atrybuty lokalizacji centrum roboczego.

  • Funkcja string() zwraca wartość ciągu z elementu <step>.

Jest to częściowy wynik:

<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. Znajdź wszystkie numery telefonów w kolumnie AdditionalContactInfo

Poniższe zapytanie pobiera dodatkowe numery telefonów dla określonego kontaktu klienta, wyszukując całą hierarchię elementu <telephoneNumber>. Ponieważ element <telephoneNumber> może być wyświetlany w dowolnym miejscu w hierarchii, zapytanie używa operatora potomnego i samodzielnego (/) w wyszukiwaniu.

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  

Jest to 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 poziomu, w szczególności <telephoneNumber> elementów podrzędnych <AdditionalContactInfo>, wyrażenie FOR w zapytaniu zmienia się na

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

Zobacz też

XQuery Basics
konstrukcji XML (XQuery)
danych XML (SQL Server)