Модули и прологи — пролог XQuery

Применимо к: SQL Server (все поддерживаемые версии)

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

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

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   

См. также:

Добавление пространств имен в запросы с WITH XMLNAMESPACES