Sdílet prostřednictvím


Atomizace (XQuery)

platí pro:SQL Server

Atomizace je proces extrahování typové hodnoty položky. Tento proces se předpokládá za určitých okolností. Některé z operátorů XQuery, jako jsou aritmetické a relační operátory, závisí na tomto procesu. Pokud například použijete aritmetické operátory přímo na uzly, zadaná hodnota uzlu se nejprve načte implicitně vyvoláním datové funkce . Tím se atomická hodnota předá jako operand aritmetickému operátoru.

Například následující dotaz vrátí součet atributů LaborHours. V tomto případě se data() implicitně aplikují na uzly atributů.

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)')  

I když to není povinné, můžete také explicitně zadat funkci data():

SELECT @x.query('sum(data(ROOT/Location/@LaborHours))')  

Dalším příkladem implicitní atomizace je použití aritmetických operátorů. Operátor + vyžaduje atomické hodnoty a data() se implicitně použije k načtení atomické hodnoty atributu LaborHours. Dotaz je určen pro sloupec Pokyny xml typ v tabulce ProductModel. Následující dotaz třikrát vrátí atribut LaborHours. V dotazu si všimněte následujících věcí:

  • Při vytváření OriginalLaborHours atributu je atomizace implicitně použita na singleton sekvence vrácenou ($WC/@LaborHours). Zadaná hodnota atributu LaborHours je přiřazena OriginalLaborHours.

  • Při vytváření atributu UpdatedLaborHoursV1 vyžaduje aritmetický operátor atomické hodnoty. Proto data() se implicitně aplikují na atribut LaborHours vrácený ($WC/@LaborHours). Atomická hodnota 1 se pak přidá do ní. Konstrukce atributu UpdatedLaborHoursV2 ukazuje explicitní použití data(), ale není vyžadováno.

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  

Toto je výsledek:

<WC OriginalLaborHours="2.5"   
    UpdatedLaborHoursV1="3.5"   
    UpdatedLaborHoursV2="3.5" />  

Atomizace vede k výskytu jednoduchého typu, prázdné sady nebo chyby statického typu.

Atomizace se také vyskytuje v parametrech porovnávacího výrazu předaných funkcím, hodnotách vrácených funkcemi, cast() výrazy a řazení výrazů předaných v klauzuli order by.

Viz také

základy XQuery
porovnání výrazů (XQuery)
funkce XQuery proti datového typu XML