XQueries met order
van toepassing op:SQL Server-
Relationele databases hebben geen concept van reeks. U kunt bijvoorbeeld geen aanvraag indienen, zoals 'De eerste klant ophalen uit de database'. U kunt echter een XML-document opvragen en het eerste <Customer>-element ophalen. Vervolgens haalt u altijd dezelfde klant op.
Dit onderwerp illustreert query's op basis van de volgorde waarin knooppunten in het document worden weergegeven.
Voorbeelden
Een. Productiestappen ophalen op de tweede werkcentrumlocatie voor een product
Voor een specifiek productmodel haalt de volgende query de productiestappen op de tweede werkcentrumlocatie op in een reeks werkcentrumlocaties in het productieproces.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
<ManuStep ProdModelID = "{sql:column("Production.ProductModel.ProductModelID")}"
ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >
<Location>
{ (//AWMI:root/AWMI:Location)[2]/@* }
<Steps>
{ for $s in (//AWMI:root/AWMI:Location)[2]//AWMI:step
return
<Step>
{ string($s) }
</Step>
}
</Steps>
</Location>
</ManuStep>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7
Let op het volgende uit de vorige query:
De expressies in de accolades worden vervangen door het resultaat van de evaluatie. Zie XQuery-(XML Construction) voor meer informatie.
@* haalt alle kenmerken van de tweede locatie van het werkcentrum op.
De FLWOR iteratie (FOR ... RETURN) haalt alle <
step
> onderliggende elementen van de tweede werkcentrumlocatie op.De functie sql:column() (XQuery) bevat de relationele waarde in de XML die wordt samengesteld.
Dit is het resultaat:
<ManuStep ProdModelID="7" ProductModelName="HL Touring Frame">
<Location LocationID="20" SetupHours="0.15"
MachineHours="2" LaborHours="1.75" LotSize="1">
<Steps>
<Step>Assemble all frame components following blueprint 1299.</Step>
...
</Steps>
</Location>
</ManuStep>
Met de vorige query worden alleen de tekstknooppunten opgehaald. Als u het hele <step
> element wilt retourneren, verwijdert u de tekenreeks() functie uit de query:
B. Vind alle materiaal en hulpmiddelen die worden gebruikt op de tweede werkcentrumlocatie in de productie van een product
Voor een specifiek productmodel haalt de volgende query de hulpprogramma's en materialen op die worden gebruikt op de tweede werkcentrumlocatie in de volgorde van werkcentrumlocaties in het productieproces.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
<Location>
{ (//AWMI:root/AWMI:Location)[1]/@* }
<Tools>
{ for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:tool
return
<Tool>
{ string($s) }
</Tool>
}
</Tools>
<Materials>
{ for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:material
return
<Material>
{ string($s) }
</Material>
}
</Materials>
</Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7
Let op het volgende uit de vorige query:
De query bouwt het element <Loca
tion
> en haalt de bijbehorende kenmerkwaarden op uit de database.Het gebruikt twee FLWOR (voor... return) iteraties: één om hulpprogramma's op te halen en één om het gebruikte materiaal op te halen.
Dit is het resultaat:
<Location LocationID="10" SetupHours=".5"
MachineHours="3" LaborHours="2.5" LotSize="100">
<Tools>
<Tool>T-85A framing tool</Tool>
<Tool>Trim Jig TJ-26</Tool>
<Tool>router with a carbide tip 15</Tool>
<Tool>Forming Tool FT-15</Tool>
</Tools>
<Materials>
<Material>aluminum sheet MS-2341</Material>
</Materials>
</Location>
C. De eerste twee productfunctiesbeschrijvingen ophalen uit de productcatalogus
Voor een specifiek productmodel haalt de query de eerste twee functiebeschrijvingen op uit het <Features
> element in de productmodelcatalogus.
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<ProductModel ProductModelID= "{ data( (/p1:ProductDescription/@ProductModelID)[1] ) }"
ProductModelName = "{ data( (/p1:ProductDescription/@ProductModelName)[1] ) }" >
{
for $F in /p1:ProductDescription/p1:Features
return
$F/*[position() <= 2]
}
</ProductModel>
') as x
FROM Production.ProductModel
where ProductModelID=19
Let op het volgende uit de vorige query:
De hoofdtekst van de query bouwt XML met het <ProductModel
>-element met de kenmerken ProductModelID en ProductModelName.
- De query maakt gebruik van een FOR ... Return-lus om de productmodelfunctiebeschrijvingen op te halen. De functie position() wordt gebruikt om de eerste twee functies op te halen.
Dit is het resultaat:
<ProductModel ProductModelID="19" ProductModelName="Mountain 100">
<p1:Warranty
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<p1:WarrantyPeriod>3 year</p1:WarrantyPeriod>
<p1:Description>parts and labor</p1:Description>
</p1:Warranty>
<p2:Maintenance
xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<p2:NoOfYears>10</p2:NoOfYears>
<p2:Description>maintenance contact available through your dealer
or any AdventureWorks retail store.
</p2:Description>
</p2:Maintenance>
</ProductModel>
D. De eerste twee hulpprogramma's zoeken die worden gebruikt op de eerste werkcentrumlocatie in het productieproces van het product
Voor een productmodel retourneert deze query de eerste twee hulpprogramma's die worden gebruikt op de eerste werkcentrumlocatie in de volgorde van werkcentrumlocaties in het productieproces. De query wordt opgegeven op basis van de productie-instructies die zijn opgeslagen in de kolom Instructies van de tabel Production.ProductModel.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $Inst in (//AWMI:root/AWMI:Location)[1]
return
<Location>
{ $Inst/@* }
<Tools>
{ for $s in ($Inst//AWMI:step//AWMI:tool)[position() <= 2]
return
<Tool>
{ string($s) }
</Tool>
}
</Tools>
</Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7
Dit is het resultaat:
<Location LocationID="10" SetupHours=".5"
MachineHours="3" LaborHours="2.5" LotSize="100">
<Tools>
<Tool>T-85A framing tool</Tool>
<Tool>Trim Jig TJ-26</Tool>
</Tools>
</Location>
E. Zoek de laatste twee productiestappen op de eerste locatie van het werkcentrum in de productie van een specifiek product
De query maakt gebruik van de functie last() om de laatste twee productiestappen op te halen.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
<LastTwoManuSteps>
<Last-1Step>
{ (/AWMI:root/AWMI:Location)[1]/AWMI:step[(last()-1)]/text() }
</Last-1Step>
<LastStep>
{ (/AWMI:root/AWMI:Location)[1]/AWMI:step[last()]/text() }
</LastStep>
</LastTwoManuSteps>') as Result
FROM Production.ProductModel
where ProductModelID=7
Dit is het resultaat:
<LastTwoManuSteps>
<Last-1Step>When finished, inspect the forms for defects per
Inspection Specification .</Last-1Step>
<LastStep>Remove the frames from the tool and place them in the
Completed or Rejected bin as appropriate.</LastStep>
</LastTwoManuSteps>
Zie ook
XML-gegevens (SQL Server)
XQuery Language Reference (SQL Server)
XML-constructie (XQuery)