Dela via


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 attributen LaborHours . I det här fallet data() tillämpas implicit på attributnoderna.

DECLARE @x AS 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 attributets LaborHours atomiska värde. Frågan anges mot kolumnen Instruktioner i xml- typ i tabellen ProductModel. Följande fråga returnerar attributet LaborHours tre gånger. Tänk på följande i frågan:

  • När attributet skapas OriginalLaborHours tillämpas atomisering implicit på den singleton-sekvens som returneras av $WC/@LaborHours. Attributets typade värde LaborHours tilldelas till OriginalLaborHours.

  • När attributet UpdatedLaborHoursV1 skapas kräver den aritmetiska operatorn atomiska värden. data() Därför tillämpas implicit på attributet LaborHours som returneras av $WC/@LaborHours. Atomvärdet 1 läggs sedan till i det. Attributets konstruktion 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;

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 order by-satsen.