Выражения с квантором (XQuery)
Применимо к:SQL Server
Кванторы существования и кванторы всеобщности указывают различную семантику для логических операторов, применяемых к двум последовательностям. Это показано ниже.
Экзистенциальный квантификатор
Если имеются две последовательности и любой элемент первой последовательности имеет соответствующую пару во второй последовательности согласно используемому оператору сравнения, возвращаемым значением будет True.
Универсальный квантификатор
Если имеются две последовательности и любой элемент первой последовательности имеет соответствующую пару во второй последовательности, возвращаемым значением будет True.
XQuery поддерживает выражения с квантором в следующем виде:
( some | every ) <variable> in <Expression> (,...) satisfies <Expression>
Можно использовать эти выражения в запросе для явного применения квантификации существования или всеобщности к выражению в отношении одной или нескольких последовательностей. В SQL Server выражение в satisfies
предложении должно привести к одному из следующих значений: последовательности узлов, пустой последовательности или логического значения. Действительное логическое значение результата этого выражения будет использовано в квантификации. Экзистенциальное квантификация, использующая некоторые значения, возвращают значение True, если хотя бы одно из значений, привязанных квантификатором, имеет значение True в выражении удовлетворения. Универсальная квантификация, которая использует каждый из них, должна иметь значение True для всех значений, привязанных квантификатором.
Например, следующий запрос проверяет каждый <элемент Location> , чтобы узнать, имеет ли он атрибут LocationID.
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
Так как LocationID является обязательным атрибутом <элемента Location> , вы получите ожидаемый результат:
<Result>All work centers have Location ID</Result>
Вместо использования метода query() можно использовать метод value() для возврата результата реляционному миру, как показано в следующем запросе. Запрос возвращает True, если все местоположения рабочих центров имеют атрибуты LocationID. В противном случае функция возвращает False.
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
В нижеследующем запросе проверяется, является ли одно из изображений продукции маленьким. В каталоге продукции в XML-формате хранятся разные ракурсы для каждого изображения продукта различного размера. Возможна необходимость, чтобы каждый каталог продукции в XML-формате содержал как минимум одно изображение маленького размера. Чтобы выполнить эту задачу, используется следующий запрос:
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
Частичный результат:
ProductModelID SmallPicturesStored
-------------- --------------------
19 true
Ограничения реализации
Существуют следующие ограничения:
- Утверждение типов не поддерживается как часть привязки переменной в выражениях с квантором.