Последовательность и 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 2005 для использования с поддержкой 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. |
См. также
Основные понятия
Основы языка XQuery
Об XML-столбце ProductModel.Instructions