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)