限定表达式 (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>
可以使用 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
实现限制
限制如下:
- 绑定限定表达式中的变量时不支持类型断定。