Udostępnij przez


Atomizacja (XQuery)

Dotyczy:SQL Server

Atomizacja to proces wyodrębniania typizowanej wartości elementu. Ten proces jest dorozumiany w pewnych okolicznościach. Niektóre operatory XQuery, takie jak operatory arytmetyczne i porównawcze, zależą od tego procesu. Na przykład w przypadku zastosowania operatorów arytmetycznych bezpośrednio do węzłów typowa wartość węzła jest najpierw pobierana przez niejawne wywoływanie funkcji danych. Spowoduje to przekazanie wartości niepodzielnej jako operandu do operatora arytmetycznego.

Na przykład następujące zapytanie zwraca sumę LaborHours atrybutów. W takim przypadku data() jest niejawnie stosowany do węzłów atrybutów.

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

Chociaż nie jest to wymagane, można również jawnie określić data() funkcję:

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

Innym przykładem niejawnej atomizacji jest użycie operatorów arytmetycznych. Operator + wymaga wartości niepodzielnych i data() jest niejawnie stosowany do pobierania wartości niepodzielnej atrybutu LaborHours . Zapytanie jest określane względem kolumny Instrukcje typu xml w tabeli ProductModel. Następujące zapytanie zwraca LaborHours atrybut trzy razy. W zapytaniu rozważ następujące kwestie:

  • W konstruowaniu atrybutu OriginalLaborHours atomizacja jest niejawnie stosowana do sekwencji pojedynczej zwracanej przez $WC/@LaborHourselement . Typowana wartość atrybutu LaborHours jest przypisywana do OriginalLaborHours.

  • W konstruowaniu atrybutu UpdatedLaborHoursV1 operator arytmetyczny wymaga wartości niepodzielnych. data() W związku z tym jest niejawnie stosowany do atrybutu LaborHours zwróconego przez $WC/@LaborHours. Następnie dodawana jest do niej wartość niepodzielna 1. Konstrukcja atrybutu pokazuje jawne zastosowanie data()elementu UpdatedLaborHoursV2 , ale nie jest wymagane.

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;

Oto wynik:

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

Atomizacja powoduje wystąpienie prostego typu, pustego zestawu lub błędu typu statycznego.

Atomizacja występuje również w parametrach wyrażenia porównania przekazywanych do funkcji, wartości zwracanych przez funkcje, cast() wyrażenia i wyrażenia kolejności przekazywane w klauzuli order by.