Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
De flesta xml- typkolumner i databasen AdventureWorks är halvstrukturerade dokument. Därför kan dokument som lagras på varje rad se olika ut. Frågeexemplen i det här avsnittet visar hur du extraherar information från dessa olika dokument.
Exempel
A. Hämta arbetscenterplatser tillsammans med det första tillverkningssteget på dessa platser från dokumentationen om tillverkningsinstruktioner
För produktmodell 7 konstruerar frågan XML som innehåller elementet <ManuInstr>, med ProductModelID och ProductModelName attribut och ett eller flera <Location> underordnade element.
Varje <Location> element har en egen uppsättning attribut och ett <step> underordnat element. Det här <step> underordnade elementet är det första tillverkningssteget på arbetscentrets plats.
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
Observera följande från föregående fråga:
Nyckelordet namnområde i XQuery Prolog definierar ett namnområdesprefix. Det här prefixet används senare i frågetexten.
Kontextväxlingstoken{) och (}, används för att växla frågan från XML-konstruktion till frågeutvärdering.
sql:column() används för att inkludera ett relationsvärde i XML-koden som skapas.
När du skapar <
Location>-elementet hämtar $wc/@* alla platsattribut för arbetscentret.Funktionen string() returnerar strängvärdet från <
step>-elementet.
Detta är ett partiellt resultat:
<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. Hitta alla telefonnummer i kolumnen AdditionalContactInfo
Följande fråga hämtar ytterligare telefonnummer för en specifik kundkontakt genom att söka i hela hierarkin efter elementet <telephoneNumber>. Eftersom <telephoneNumber>-elementet kan visas var som helst i hierarkin använder frågan underordnade och självoperator (//) i sökningen.
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
Det här är resultatet:
\<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>
Om du bara vill hämta de översta telefonnumren, särskilt de <telephoneNumber> underordnade elementen i <AdditionalContactInfo>, ändras FOR-uttrycket i frågan till
for $ph in /ci:AdditionalContactInfo/act:telephoneNumber.
Se även
grunderna i XQuery
XML-konstruktion (XQuery)
XML-data (SQL Server)