路径表达式 - 使用缩写语法

适用范围:SQL Server

路径表达式(XQuery)中的所有示例都对路径表达式使用未分解的语法。 路径表达式中用于轴步骤的未缩写语法包括轴名称和节点测试(用双冒号分隔),后跟零或更多个步骤限定符。

例如:

child::ProductDescription[attribute::ProductModelID=19]

XQuery 支持在路径表达式中使用下列缩写:

  • child 是默认轴。 因此, child:: 可以从表达式中的步骤中省略轴。 例如,/child::ProductDescription/child::Summary 可以写为 /ProductDescription/Summary

  • attribute 可以缩写为 @。 例如,/child::ProductDescription[attribute::ProductModelID=10] 可以写为 /ProductDescription[@ProductModelID=10]

  • A /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() 中的缩写为双点(..)。