Freigeben ü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 typisierte 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 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)')  

Obwohl nicht erforderlich, können Sie auch explizit die data() -Funktion 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 atomare Werte, und data() wird implizit angewendet, um den atomaren Wert des LaborHours-Attributs abzurufen. Die Abfrage wird für die Spalte Anweisungen des xml-Typs in der Tabelle ProductModel 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 Attributs UpdatedLaborHoursV2 zeigt die explizite Anwendung von data() an, ist aber 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 Vergleichsausdruckparametern auf, die an Funktionen übergeben werden, werte, die von Funktionen zurückgegeben werden, cast() -Ausdrücke und Reihenfolgenausdrücke, die in der Order-by-Klausel übergeben werden.

Weitere Informationen

XQuery-Grundlagen
Comparison Expressions (XQuery) (Vergleichsausdrücke (XQuery))
XQuery-Funktionen für den xml-Datentyp