XQuery-Operatoren für den xml-Datentyp

XQuery unterstützt die folgenden Operatoren:

  • Numerische Operatoren (+, -, *, div, mod)

  • Operatoren für Wertvergleiche (eq, ne, lt, gt, le, ge)

  • Operatoren für allgemeine Vergleiche ( =, !=, <, >, <=, >= )

Weitere Informationen zu diesen Operatoren finden Sie unter Vergleichsausdrücke (XQuery).

Beispiele

A. Verwenden allgemeiner Operatoren

Die folgende Abfrage zeigt die Verwendung allgemeiner Operatoren, die für Sequenzen gelten, sowie das Vergleichen von Sequenzen. Die Abfrage ruft eine Sequenz von Rufnummern für jeden Kunden aus der AdditionalContactInfo-Spalte der Contact-Tabelle ab. Diese Sequenz wird dann mit der Sequenz von zwei Rufnummern ("111-111-1111", "222-2222") verglichen.

Die Abfrage verwendet den =-Vergleichsoperator. Jeder Knoten in der Sequenz auf der rechten Seite des =-Operators wird mit jedem Knoten in der Sequenz auf der linken Seite verglichen. Wenn sich die Knoten entsprechen, ergibt der Knotenvergleich TRUE. Der Wert wird anschließend in einen int-Wert konvertiert und mit 1 verglichen; die Abfrage gibt dann die Kunden-ID zurück.

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS ACI,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT)
SELECT ContactID 
FROM   Person.Contact
WHERE  AdditionalContactInfo.value('
      //ACI:AdditionalContactInfo//ACT:telephoneNumber/ACT:number = 
          ("111-111-1111", "222-2222")',
      'bit')= cast(1 as bit)

Die Funktionsweise der vorherigen Abfrage kann auch auf eine andere Weise untersucht werden: Jeder Rufnummernwert, der aus der AdditionalContactInfo-Spalte abgerufen wird, wird mit dem Satz aus zwei Rufnummern verglichen. Wenn der Wert im Satz enthalten ist, wird der betreffende Kunde im Ergebnis zurückgegeben.

B. Verwenden eines numerischen Operators

Der +-Operator in dieser Abfrage ist ein Wertoperator, weil er sich auf ein einzelnes Element bezieht. Der Wert 1 wird z. B. zu einer Chargengröße addiert, die von der Abfrage zurückgegeben wird:

SELECT ProductModelID, Instructions.query('
     declare namespace 
 AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
     for $i in (/AWMI:root/AWMI:Location)[1]
     return 
       <Location LocationID="{ ($i/@LocationID) }"
                   LotSize  = "{  number($i/@LotSize) }"
                   LotSize2 = "{ number($i/@LotSize) + 1 }"
                   LotSize3 = "{ number($i/@LotSize) + 2 }" >
                   
       </Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7

C. Verwenden eines Wertoperators

Die folgende Abfrage ruft die <Picture>-Elemente für ein Produktmodell ab, wobei die Bildgröße "small" ist:

SELECT CatalogDescription.query('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     for $P in /PD:ProductDescription/PD:Picture[PD:Size eq "small"]
     return
           $P
    ') as Result
FROM Production.ProductModel
where ProductModelID=19

Da es sich bei den Operanden des eq-Operators um atomare Werte handelt, wird der Wertoperator in der Abfrage verwendet. Sie können die gleiche Abfrage mithilfe des allgemeinen Vergleichsoperators (=) schreiben.