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 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 Atomwerte, und Data() wird implizit angewendet, um den atomalen Wert 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. Beachten Sie in der Abfrage Folgendes:
Beim Erstellen des OriginalLaborHours-Attributs wird die Atomisierung implizit auf die singleton-Sequenz angewendet, die von (
$WC/@LaborHours
) zurückgegeben wird. Der typierte Wert des LaborHours-Attributs wird OriginalLaborHours zugewiesen.Bei der Konstruktion des UpdatedLaborHoursV1-Attributs macht der arithmetische Operator atomare Werte erforderlich. Daher wird data() implizit auf das LaborHours-Attribut angewendet, das von (
$WC/@LaborHours
) zurückgegeben wird. 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
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 erfolgt auch in Vergleichsausdrucksparametern, die an Funktionen, von Funktionen zurückgegebene Werte, cast()- Ausdrücke und Sortierungsausdrücke, die in der Reihenfolge nach Klausel übergeben werden.
Weitere Informationen
XQuery-Grundlagen
Comparison Expressions (XQuery) (Vergleichsausdrücke (XQuery))
XQuery Functions against the xml Data Type (XQuery-Funktionen für den xml-Datentyp)