Quantifizierte Ausdrücke (XQuery)
Gilt für:SQL Server
Die Semantik für auf zwei Sequenzen angewendete boolesche Operatoren unterscheidet sich bei existenziellen und universellen Quantifizierern, wie in der folgenden Tabelle dargestellt.
Existenzielle Quantifizierer
Wenn in zwei Sequenzen ein beliebiges Element der ersten Sequenz infolge des verwendeten Vergleichsoperators mit einem Element in der zweiten Sequenz übereinstimmt, ist der zurückgegebene Wert True.
Universelle Quantifizierer
Wenn in zwei Sequenzen jedes Element der ersten Sequenz mit einem Element in der zweiten Sequenz übereinstimmt, ist der zurückgegebene Wert True.
XQuery unterstützt quantifizierte Ausdrücke in der folgenden Form:
( some | every ) <variable> in <Expression> (,...) satisfies <Expression>
Sie können diese Ausdrücke in einer Abfrage verwenden, um entweder die existenzielle oder die universelle Quantifizierung über eine oder mehrere Sequenzen auf einen Ausdruck anzuwenden. In SQL Server muss der Ausdruck in der satisfies
-Klausel zu einer der folgenden Ergebnisse führen: eine Knotensequenz, eine leere Sequenz oder ein boolescher Wert. Der effektive boolesche Wert des Ergebnisses dieses Ausdrucks wird dann in der Quantifizierung verwendet. Die existenzielle Quantifizierung, die einige verwendet, gibt True zurück, wenn mindestens einer der vom Quantifizierer gebundenen Werte ein True-Ergebnis im Satisfy-Ausdruck aufweist. Die universelle Quantifizierung, die jede verwendet, muss true für alle Werte aufweisen, die vom Quantifizierer gebunden sind.
Die folgende Abfrage überprüft beispielsweise jedes <Location-Element> , um festzustellen, ob es über ein LocationID-Attribut verfügt.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
if (every $WC in //AWMI:root/AWMI:Location
satisfies $WC/@LocationID)
then
<Result>All work centers have workcenterLocation ID</Result>
else
<Result>Not all work centers have workcenterLocation ID</Result>
') as Result
FROM Production.ProductModel
where ProductModelID=7
Da LocationID ein erforderliches Attribut des <Location-Elements> ist, erhalten Sie das erwartete Ergebnis:
<Result>All work centers have Location ID</Result>
Anstatt die query()-Methode zu verwenden, können Sie die value()-Methode verwenden, um das Ergebnis an die relationale Welt zurückzugeben, wie in der folgenden Abfrage gezeigt. Die Abfrage gibt True zurück, wenn alle Arbeitsplatzstandorte LocationID-Attribute besitzen. Anderenfalls gibt die Abfrage False zurück.
SELECT Instructions.value('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
every $WC in //AWMI:root/AWMI:Location
satisfies $WC/@LocationID',
'nvarchar(10)') as Result
FROM Production.ProductModel
where ProductModelID=7
Die folgende Abfrage überprüft, ob eine der Produktabbildungen im Kleinformat vorhanden ist. In den XML-Produktkatalogdaten sind für jedes Produkt Abbildungen aus verschiedenen Winkeln und in verschiedenen Größen gespeichert. Angenommen, Sie möchten sicherstellen, dass alle XML-Produktkatalogdaten mindestens eine Abbildung im Kleinformat enthalten. Dies erreichen Sie mit der folgenden Abfrage:
SELECT ProductModelID, CatalogDescription.value('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
some $F in /PD:ProductDescription/PD:Picture
satisfies $F/PD:Size="small"', 'nvarchar(20)') as SmallPicturesStored
FROM Production.ProductModel
WHERE ProductModelID = 19
Dies ist ein Teilergebnis:
ProductModelID SmallPicturesStored
-------------- --------------------
19 true
Implementierungseinschränkungen
Die folgenden Einschränkungen sind zu beachten:
- Die Typassertion wird als Teil der Bindung der Variablen in quantifizierten Ausdrücken nicht unterstützt.