Модули и прологи — пролог 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 содержит объявление
(namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
префикса пространства имен (AWMI).Ключевое слово
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