路径表达式 - 使用缩写语法
适用范围:SQL Server
了解 XQuery 中路径表达式的所有示例都对路径表达式使用未分解的语法。 路径表达式中用于轴步骤的未缩写语法包括轴名称和节点测试(用双冒号分隔),后跟零或更多个步骤限定符。
例如:
child::ProductDescription[attribute::ProductModelID=19]
XQuery 支持在路径表达式中使用下列缩写:
子轴是默认轴。 因此, 可以从表达式中的步骤中省略子轴:: 轴。 例如,
/child::ProductDescription/child::Summary
可以写为/ProductDescription/Summary
。属性轴可以缩写为 @。 例如,
/child::ProductDescription[attribute::ProductModelID=10]
可以写为/ProductDescription[@ProductModelID=10]
。/descendant-or-self::node()/可以缩写为 //。 例如,
/descendant-or-self::node()/child::act:telephoneNumber
可以写为//act:telephoneNumber
。上一个查询检索了存储在 Contact 表的 AdditionalContactInfo 列中的所有电话号码。 AdditionalContactInfo 的架构定义方式 <是,电话编号> 元素可以在文档中的任意位置显示。 因此,若要检索所有电话号码,必须搜索文档中的每一个节点。 从文档的根节点开始搜索,接下来搜索所有后代节点。
以下查询将检索某一特定客户的联系人的所有电话号码:
SELECT AdditionalContactInfo.query(' declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes"; declare namespace crm="https://schemas.adventure-works.com/Contact/Record"; declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo"; /descendant-or-self::node()/child::act:telephoneNumber ') as result FROM Person.Contact WHERE ContactID=1
如果将路径表达式替换为缩写语法
//act:telephoneNumber
,会收到相同的结果。步骤 中的 self::node() 可以缩写为单个点(.)。 但是,该点与 self::node()不相等或可互换。
例如,在以下查询中,使用点表示的是一个值而不是节点:
("abc", "cde")[. > "b"]
步骤 中的 parent::node() 可以缩写为双点(..)。