Поделиться через


Выражения с квантором (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        

Ограничения реализации

Существуют следующие ограничения:

  • Утверждение типов не поддерживается как часть привязки переменной в выражениях с квантором.

См. также

Выражения XQuery