Atomisering (XQuery)
gäller för:SQL Server
Atomisering är processen för att extrahera det typerade värdet för ett objekt. Den här processen är underförstådd under vissa omständigheter. Vissa av XQuery-operatorerna, till exempel aritmetiska operatorer och jämförelseoperatorer, är beroende av den här processen. När du till exempel använder aritmetiska operatorer direkt på noder hämtas först det typbeskrivna värdet för en nod genom att implicit anropa -datafunktionen. Detta skickar atomvärdet som en operand till den aritmetiska operatorn.
Följande fråga returnerar till exempel summan av LaborHours-attributen. I det här fallet tillämpas data() implicit på attributnoderna.
declare @x xml
set @x='<ROOT><Location LID="1" SetupTime="1.1" LaborHours="3.3" />
<Location LID="2" SetupTime="1.0" LaborHours="5" />
<Location LID="3" SetupTime="2.1" LaborHours="4" />
</ROOT>'
-- data() implicitly applied to the attribute node sequence.
SELECT @x.query('sum(/ROOT/Location/@LaborHours)')
Även om det inte krävs kan du också uttryckligen ange funktionen data():
SELECT @x.query('sum(data(ROOT/Location/@LaborHours))')
Ett annat exempel på implicit atomisering är när du använder aritmetiska operatorer. Operatorn + kräver atomiska värden och data() används implicit för att hämta atomvärdet för attributet LaborHours. Frågan anges mot kolumnen Instruktioner i xml- typ i tabellen ProductModel. Följande fråga returnerar attributet LaborHours tre gånger. Observera följande i frågan:
När du skapar attributet OriginalLaborHours tillämpas atomisering implicit på den singleton-sekvens som returneras av (
$WC/@LaborHours
). Det angivna värdet för attributet LaborHours tilldelas till OriginalLaborHours.När du skapar attributet UpdatedLaborHoursV1 kräver den aritmetiska operatorn atomiska värden. Därför tillämpas data() implicit på attributet LaborHours som returneras av (
$WC/@LaborHours
). Atomvärdet 1 läggs sedan till i det. Konstruktionen av attributet UpdatedLaborHoursV2 visar den explicita tillämpningen av data(), men krävs inte.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in /AWMI:root/AWMI:Location[1]
return
<WC OriginalLaborHours = "{ $WC/@LaborHours }"
UpdatedLaborHoursV1 = "{ $WC/@LaborHours + 1 }"
UpdatedLaborHoursV2 = "{ data($WC/@LaborHours) + 1 }" >
</WC>') as Result
FROM Production.ProductModel
where ProductModelID=7
Det här är resultatet:
<WC OriginalLaborHours="2.5"
UpdatedLaborHoursV1="3.5"
UpdatedLaborHoursV2="3.5" />
Atomiseringen resulterar i en instans av en enkel typ, en tom uppsättning eller ett statiskt typfel.
Atomisering sker också i jämförelseuttrycksparametrar som skickas till funktioner, värden som returneras av funktioner, cast() uttryck och ordningsuttryck som skickas i ordningen efter-satsen.
Se även
grunderna i XQuery
jämförelseuttryck (XQuery)
XQuery Functions mot xml-datatypen