Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
van toepassing op:SQL Server-
XQuery ondersteunt de volgende voorwaardelijke if-then-else instructie:
if (<expression1>)
then
<expression2>
else
<expression3>
Afhankelijk van de effectieve Booleaanse waarde van expression1, wordt expression2 of expression3 geëvalueerd. Bijvoorbeeld:
Als de testexpressie,
expression1, resulteert in een lege reeks, is het resultaat Onwaar.Als de testexpressie,
expression1, resulteert in een eenvoudige Booleaanse waarde, is deze waarde het resultaat van de expressie.Als de testexpressie,
expression1, resulteert in een reeks van een of meer knooppunten, is het resultaat van de expressie Waar.Anders wordt er een statische fout gegenereerd.
Let ook op het volgende:
De testexpressie moet tussen haakjes staan.
De else expressie is vereist. Als u deze niet nodig hebt, kunt u "( ) " retourneren, zoals geïllustreerd in de voorbeelden in dit onderwerp.
De volgende query wordt bijvoorbeeld opgegeven op basis van de xml- typevariabele. De als voorwaarde de waarde van de SQL-variabele (@v) in de XQuery-expressie test met behulp van de functie sql:variable() extensiefunctie. Als de waarde van de variabele 'FirstName' is, wordt het <FirstName>-element geretourneerd. Anders wordt het <LastName> element geretourneerd.
declare @x xml
declare @v varchar(20)
set @v='FirstName'
set @x='
<ROOT rootID="2">
<FirstName>fname</FirstName>
<LastName>lname</LastName>
</ROOT>'
SELECT @x.query('
if ( sql:variable("@v")="FirstName" ) then
/ROOT/FirstName
else
/ROOT/LastName
')
Dit is het resultaat:
<FirstName>fname</FirstName>
Met de volgende query worden de eerste twee functiebeschrijvingen opgehaald uit de productcatalogusbeschrijving van een specifiek productmodel. Als het document meer functies bevat, wordt er een <there-is-more> element met lege inhoud toegevoegd.
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product>
{ /p1:ProductDescription/@ProductModelID }
{ /p1:ProductDescription/@ProductModelName }
{
for $f in /p1:ProductDescription/p1:Features/*[position()\<=2]
return
$f
}
{
if (count(/p1:ProductDescription/p1:Features/*) > 2)
then \<there-is-more/>
else ()
}
</Product>
') as x
FROM Production.ProductModel
WHERE ProductModelID = 19
In de vorige query controleert de voorwaarde in de of expressie controleert of er meer dan twee onderliggende elementen in <Features>zijn. Zo ja, dan wordt het \<there-is-more/> element in het resultaat geretourneerd.
Dit is het resultaat:
<Product ProductModelID="19" ProductModelName="Mountain 100">
\<p1:Warranty xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
\<p1:WarrantyPeriod>3 years\</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 years\</p2:NoOfYears>
\<p2:Description>maintenance contract available through your dealer or any AdventureWorks retail store.\</p2:Description>
\</p2:Maintenance>
\<there-is-more />
</Product>
In de volgende query wordt een <Location>-element met een LocationID-kenmerk geretourneerd als de locatie van het werkcentrum de installatieuren niet opgeeft.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in //AWMI:root/AWMI:Location
return
if ( $WC[not(@SetupHours)] )
then
<WorkCenterLocation>
{ $WC/@LocationID }
</WorkCenterLocation>
else
()
') as Result
FROM Production.ProductModel
where ProductModelID=7
Dit is het resultaat:
<WorkCenterLocation LocationID="30" />
<WorkCenterLocation LocationID="45" />
<WorkCenterLocation LocationID="60" />
Deze query kan zonder de worden geschreven als component, zoals wordt weergegeven in het volgende voorbeeld:
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in //AWMI:root/AWMI:Location[not(@SetupHours)]
return
<Location>
{ $WC/@LocationID }
</Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7