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.
See Also