Atomisierung (XQuery)

Atomisierung ist das Verfahren, durch das der typisierte Wert eines Elements extrahiert wird. Dieses Verfahren wird unter bestimmten Umständen implizit verwendet. Bestimmte XQuery-Operatoren, wie z. B. arithmetische und Vergleichsoperatoren, sind von diesem Verfahren abhängig. Wenn Sie beispielsweise arithmetische Operatoren direkt auf Knoten anwenden, wird zunächst der typisierte Wert des Knotens abgerufen, indem implizit die data-Funktion aufgerufen wird. Auf diese Weise wird der atomare Wert dem arithmetischen Operator als Operand übergeben.

Die folgende Abfrage gibt beispielsweise den Gesamtwert der LaborHours-Attribute zurück. In diesem Fall wird data() implizit auf die Attributknoten angewendet.

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

Sie können die data()-Funktion auch explizit angeben; dies ist jedoch nicht erforderlich:

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

Ein anderes Beispiel für die implizite Atomisierung ist das Verwenden von arithmetischen Operatoren. Der +-Operator macht atomare Werte erforderlich, daher wird data() implizit angewendet, um den atomaren Wert des LaborHours-Attributs abzurufen. Die Abfrage wird für die Instructions-Spalte des xml-Typs der ProductModel-Tabelle angegeben. Die folgende Abfrage gibt das LaborHours-Attribut dreimal zurück. Beachten Sie in der Abfrage Folgendes:

  • Bei der Konstruktion des OriginalLaborHours-Attributs wird die Atomisierung implizit auf die von ($WC/@LaborHours) zurückgegebene Singleton-Sequenz angewendet. Der typisierte Wert des LaborHours-Attributs wird anschließend dem OriginalLaborHours-Attribut zugewiesen.

  • Bei der Konstruktion des UpdatedLaborHoursV1-Attributs macht der arithmetische Operator atomare Werte erforderlich. Daher wird data() implizit auf das von ($WC/@LaborHours) zurückgegebene LaborHours-Attribut angewendet. Anschließend wird dem Attribut der atomare Wert 1 hinzugefügt. Die Konstruktion des UpdatedLaborHoursV2-Attributs zeigt die explizite Anwendung von data(). Die explizite Anwendung ist jedoch nicht erforderlich.

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

Dies ist das Ergebnis:

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

Aus der Atomisierung ergibt sich eine Instanz eines einfachen Datentyps, ein leeres Dataset oder ein Fehler bezüglich des statischen Typs.

Die Atomisierung tritt auch in Parametern von Vergleichsausdrücken auf, die an Funktionen übergeben werden, sowie in von Funktionen zurückgegebenen Werten, cast()-Ausdrücken und in in der ORDER BY-Klausel übergebenen Ausdrücken.