Последовательность и QNames (XQuery)

Применимо к:SQL Server

В этом разделе описаны следующие основные понятия XQuery.

  • Sequence

  • QNames и стандартные пространства имен.

Sequence

Результат выражения в XQuery является последовательностью XML-узлов и экземпляров атомарных типов XSD. Отдельная запись последовательности называется элементом. Элемент последовательности может быть одним из следующих объектов.

  • Такой узел, как элемент, атрибут, текст, инструкция по обработке, комментарий или документ.

  • Такое атомарное значение, как экземпляр простого типа XSD.

Например, следующий запрос создает последовательность из двух элементов-узлов:

SELECT Instructions.query('  
     <step1> Step 1 description goes here</step1>,  
     <step2> Step 2 description goes here </step2>  
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7;  
  

Результат:

<step1> Step 1 description goes here </step1>  
<step2> Step 2 description goes here </step2>   

В предыдущем запросе запятая (,) в конце конструкции <step1> выполняет роль конструктора последовательности и является обязательной. Пробелы в результате добавлены только для иллюстрации и включены во все примеры результатов в документации.

Ниже приведены дополнительные сведения о последовательностях, которые следует иметь в виду.

  • Если результат запроса представляет собой последовательность, которая содержит другую последовательность, то эта внутренняя последовательность упрощается до последовательности-контейнера. Например, последовательность ((1,2, (3,4,5)),6) упрощается в (1, 2, 3, 4, 5, 6).

    DECLARE @x xml;  
    SET @x = '';  
    SELECT @x.query('(1,2, (3,4,5)),6');  
    
  • Пустой последовательностью называется та, которая не содержит элементов. Она записывается как «()».

  • Последовательность, состоящую из единственного элемента, можно использовать как атомарное значение, и наоборот. То есть (1) = 1.

В такой реализации последовательность должна быть однородной. То есть последовательность состоит либо из атомарных значений, либо из узлов. Например, ниже приведены допустимые последовательности.

DECLARE @x xml;  
SET @x = '';  
-- Expression returns a sequence of 1 text node (singleton).  
SELECT @x.query('1');  
-- Expression returns a sequence of 2 text nodes  
SELECT @x.query('"abc", "xyz"');  
-- Expression returns a sequence of one atomic value. data() returns  
-- typed value of the node.  
SELECT @x.query('data(1)');  
-- Expression returns a sequence of one element node.   
-- In the expression XML construction is used to construct an element.  
SELECT @x.query('<x> {1+2} </x>');  

Следующий запрос вернет ошибку, поскольку разнородные последовательности не поддерживаются.

SELECT @x.query('<x>11</x>, 22');  

QName

Любой идентификатор в XQuery является именем QName. Имя QName состоит из префикса пространства имен и локального имени. В этой реализации имена переменных в XQuery являются именами QName и не могут иметь префиксов.

Рассмотрим следующий пример, в котором запрос указан для нетипизированной xml-переменной :

DECLARE @x xml;  
SET @x = '<Root><a>111</a></Root>';  
SELECT @x.query('/Root/a');  

В выражении (/Root/a) Root и a являются именами QName.

В следующем примере запрос указывается в типизированном xml-столбце . Запрос выполняет итерацию по всем <элементам шага> в первом расположении рабочего центра.

SELECT Instructions.query('  
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
for $Step in /AWMI:root/AWMI:Location[1]/AWMI:step  
      return  
           string($Step)   
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7;  

На панели запросов отметьте следующее.

  • AWMI root, AWMI:Location, AWMI:step и $Step относятся к типу данных QNames. AWMI является префиксом, а root, Location и Step — локальными именами.

  • Переменная $step — это имя QName, у нее нет префикса.

Следующие пространства имен предопределяются для использования с поддержкой XQuery в SQL Server.

Префикс URI
xs http://www.w3.org/2001/XMLSchema
xsi http://www.w3.org/2001/XMLSchema-instance
xdt http://www.w3.org/2004/07/xpath-datatypes
fn http://www.w3.org/2004/07/xpath-functions
(без префикса) urn:schemas-microsoft-com:xml-sql
sqltypes https://schemas.microsoft.com/sqlserver/2004/sqltypes
xml http://www.w3.org/XML/1998/namespace
(без префикса) https://schemas.microsoft.com/sqlserver/2004/SOAP

Каждая созданная база данных содержит коллекцию схем sys XML. Эти схемы зарезервированы, поэтому к ним можно обратиться из любой пользовательской коллекции XML-схем.

Заметка

Эта реализация не поддерживает local префикс, как описано в спецификации XQuery.http://www.w3.org/2004/07/xquery-local-functions

См. также

Основы XQuery