Последовательность и QNames (XQuery)
В этом разделе описаны следующие основные понятия XQuery.
Последовательность.
QNames и стандартные пространства имен.
Последовательность
Результат выражения в 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. Запрос выполняется для всех элементов <step> в расположении первого рабочего центра.
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 являются именами QName. AWMI — это префикс, а root, Location и Step являются локальными именами.
Переменная $step — это имя QName, у нее нет префикса.
Ниже приведены пространства имен, стандартные в SQL Server для использования с поддержкой XQuery.
Префикс |
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-datatypes |
(без префикса) |
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 |
У всех создаваемых баз данных есть коллекции XML-схем sys. Эти схемы зарезервированы, поэтому к ним можно обратиться из любой пользовательской коллекции XML-схем. Дополнительные сведения см. в разделе Встроенные коллекции XML-схем (sys).
Примечание |
---|
Данная реализация не поддерживает префикс local согласно спецификации XQuery на http://www.w3.org/2004/07/xquery-local-functions. |
См. также