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


Пролог XQuery

Запрос XQuery состоит из пролога и текста запроса. Пролог XQuery является набором объявлений и определений, создающим требуемую для обработки запроса среду. На сервере SQL Server, в прологе XQuery могут содержаться объявления пространств имен. Текст запроса XQuery состоит из последовательности выражений, которые определяют желаемый результат запроса.

Например, следующий запрос XQuery задан для столбца Instructions с типом данных xml, в котором хранятся инструкции по производству продукта в формате XML. Запрос получает инструкции по производству продукта для производственного цеха 10. Для определения запроса XQuery используется метод query() типа данных xml.

SELECT Instructions.query('declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";         
    /AWMI:root/AWMI:Location[@LocationID=10]
') AS Result 
FROM  Production.ProductModel
WHERE ProductModelID=7

Обратите внимание на следующее в предыдущем запросе.

  • Пролог XQuery содержит объявление префикса пространства имен (AWMI), (namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";.

  • Ключевое слово declare namespace определяет префикс пространств имен, который впоследствии используется в теле запроса.

  • /AWMI:root/AWMI:Location[@LocationID="10"] является текстом запроса.

Объявление пространств имен

Объявление пространств имен задает префикс и связывает его с URI-кодом пространства имен, как показано в следующем запросе. В данном запросе CatalogDescription является столбцом типа данных xml.

В определенном запросе XQuery для этого столбца пролог запроса определяет объявление declare namespace, которое связывает префикс PD, описание продукта с URI-кодом пространства имен. Затем этот префикс используется в теле запроса вместо URI-кода пространства имен. Узлы результирующего XML находятся в пространстве имен, связанном с URI-кодом пространства имен.

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
         /PD:ProductDescription/PD:Summary 
    ') as Result
FROM Production.ProductModel
where ProductModelID=19

Чтобы упростить понимание запроса, можно объявлять пространства имен при помощи WITH XMLNAMESPACES, а не путем объявления префиксов и пространств имен, связанных в прологе запроса при помощи declare namespace.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)

SELECT CatalogDescription.query('
         /PD:ProductDescription/PD:Summary 
    ') as Result
FROM Production.ProductModel
where ProductModelID=19

Дополнительные сведения см. в разделе Добавление пространств имен с помощью предложения WITH XMLNAMESPACES.

Установленные по умолчанию объявления пространств имен

Вместо объявления префикса пространства при помощи объявления declare namespace можно использовать объявление declare default element namespace для привязки заданного по умолчанию пространства имен к именам элементов. В этом случае не нужно задавать префикс.

В следующем примере выражение пути в теле запроса не определяет префикс пространства имен. По умолчанию все имена элементов, принадлежащие заданному по умолчанию пространству имен, определяются в прологе.

SELECT CatalogDescription.query('
     declare default element namespace  "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
        /ProductDescription/Summary 
    ') as Result
FROM  Production.ProductModel
WHERE ProductModelID=19 

Можно объявить заданное по умолчанию пространство имен при помощи WITH XMLNAMESPACES:

WITH XMLNAMESPACES (DEFAULT 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription')
SELECT CatalogDescription.query('
        /ProductDescription/Summary 
    ') as Result
FROM  Production.ProductModel
WHERE ProductModelID=19