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


Выражения пути — использование сокращенного синтаксиса

Область применения: 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.

    Предыдущий запрос получает все телефонные номера, хранящиеся в столбце AdditionalContactInfo таблицы Contact. Схема для AdditionalContactInfo определяется таким образом, что <элемент telephoneNumber> может отображаться в любом месте документа. Поэтому для получения всех телефонных номеров необходимо просмотреть каждый узел в документе. Поиск начинается от корня документа и проходит по всем узлам, являющимся его потомками.

    Следующий запрос получает все контактные телефонные номера для указанного клиента:

    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"]  
    
  • Родительский ::node() на шаге может быть сокращен до двойной точки (.).).