Teilen über


Atomisierung (XQuery)

Gilt für:SQL Server

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 der eingegebene Wert eines Knotens zuerst durch implizites Aufrufen der Datenfunktion abgerufen. Auf diese Weise wird der atomare Wert dem arithmetischen Operator als Operand übergeben.

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

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

Obwohl nicht erforderlich, können Sie die data() Funktion auch explizit angeben:

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

Ein anderes Beispiel für die implizite Atomisierung ist das Verwenden von arithmetischen Operatoren. Der + Operator erfordert atome Werte und data() wird implizit angewendet, um den Atomwert des LaborHours Attributs abzurufen. Die Abfrage wird anhand der Spalte "Anweisungen" des XML-Typs in der Tabelle "ProductModel" angegeben. Die folgende Abfrage gibt das LaborHours Attribut dreimal zurück. Berücksichtigen Sie in der Abfrage Folgendes:

  • Beim Erstellen des OriginalLaborHours Attributs wird die Atomisierung implizit auf die singleton-Sequenz angewendet, die von $WC/@LaborHours. Der typierte Wert des LaborHours Attributs wird zugewiesen OriginalLaborHours.

  • Beim Erstellen des Attributs erfordert der UpdatedLaborHoursV1 arithmetische Operator atomische Werte. Daher wird implizit auf das LaborHours attribut angewendet, data() das von $WC/@LaborHours. Anschließend wird dem Attribut der atomare Wert 1 hinzugefügt. Die Erstellung des Attributs UpdatedLaborHoursV2 zeigt die explizite Anwendung von data(), 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;

Das Ergebnis lautet wie folgt:

<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 erfolgt auch in Vergleichsausdrucksparametern, die an Funktionen, von Funktionen, cast() Ausdrücken und Sortierausdrücken zurückgegebene Werte übergeben werden, die in der Reihenfolge nach Klausel übergeben werden.