XQuery-Abfragen unter Einbeziehung von Hierarchien
Gilt für:SQL Server
Die meisten Xml-Typspalten in der AdventureWorks-Datenbank sind semistrukturierte Dokumente. Deshalb können die in jeder Zeile gespeicherten Dokumente unterschiedlich aussehen. Die in diesem Thema gezeigten Abfragebeispiele veranschaulichen, wie Informationen aus diesen unterschiedlichen Dokumenten extrahiert werden können.
Beispiele
A. Abrufen von Arbeitsplatzstandorten mit dem zugehörigen ersten Fertigungsschritt aus Dokumenten mit Produktionsanweisungen
Für Produktmodell 7 erstellt die Abfrage XML, die das -Element mit den <ManuInstr
> Attributen ProductModelID und ProductModelName sowie mindestens einem <Location
> untergeordneten Element enthält.
Jedes <Location
> Element verfügt über einen eigenen Satz von Attributen und ein <step
> untergeordnetes Element. Dieses <step
> untergeordnete Element ist der erste Fertigungsschritt am Arbeitsplatzstandort.
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
Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:
Das namespace-Schlüsselwort im XQuery Prolog definiert ein Namespacepräfix. Dieses Präfix wirt später im Body-Teil der Abfrage verwendet.
Die Tokens zum Kontextwechsel, {) und (}, bewirken das Wechseln der Abfrage von der XML-Konstruktion zur Abfrageauswertung.
Sql:column() wird verwendet, um einen relationalen Wert in den XML-Code einzuschließen, der erstellt wird.
Beim Erstellen des <
Location
> Elements ruft $wc/@* alle Attribute des Arbeitsplatzstandorts ab.Die string() -Funktion gibt den Zeichenfolgenwert aus dem <
step
> -Element zurück.
Dies ist ein Teilergebnis:
<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. Suchen aller Telefonnummern in der AdditionalContactInfo-Spalte
Die folgende Abfrage ruft zusätzliche Telefonnummern für einen bestimmten Kundenkontakt ab, indem die gesamte Hierarchie nach dem <telephoneNumber
> Element durchsucht wird. Da das <telephoneNumber
> Element an einer beliebigen Stelle in der Hierarchie angezeigt werden kann, verwendet die Abfrage den Nachfolger und den Selbstoperator (//) in der Suche.
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
Dies ist das Ergebnis:
\<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>
Um nur die Telefonnummern der obersten Ebene abzurufen, insbesondere die <telephoneNumber
> untergeordneten Elemente von <AdditionalContactInfo
>, ändert sich der FOR-Ausdruck in der Abfrage in
for $ph in /ci:AdditionalContactInfo/act:telephoneNumber
.
Siehe auch
XQuery-Grundlagen
XML Construction (XQuery) (XML-Konstruktion (XQuery))
XML-Daten (SQL Server)