限定表达式 (XQuery)
存在量词和全称量词为应用于两个序列的布尔运算符指定不同的语义。如下表所示。
存在量词
假设有两个序列,第一个序列中的某一项在第二个序列中存在匹配项,则根据所用的比较运算符,返回的值为 True。全称量词
假设有两个序列,第一个序列中的每一项在第二个序列中都存在匹配项,则返回的值为 True。
XQuery 支持下列格式的限定表达式:
( some | every ) <variable> in <Expression> (,…) satisfies <Expression>
可以在查询中使用这些表达式,来对作用于一个或多个序列上的表达式显式应用存在限定或全称限定。在 SQL Server 中,satisfies 子句中表达式的结果可以为:节点序列、空序列或布尔值。限定中将使用该表达式结果的有效布尔值。如果 satisfies 表达式中量词限定的值至少有一个为 True,则使用 some 的存在限定将返回 True。使用 every 的全称限定则需要量词限定的所有值都为 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>
使用 value() 方法(而不是 query() 方法)可以将结果返回到关系环境,如下面的查询所示。如果所有生产车间都具有 LocationID 属性,则查询返回 True。否则,查询返回 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
实现限制
限制如下:
- 绑定限定表达式中的变量时不支持类型断定。