Первичные выражения (XQuery)

Первичные выражения XQuery включают литералы, ссылки на переменные, выражения элементов контекста, конструкторы и вызовы функций.

Литералы

Литералы выражений XQuery могут быть строковыми или числовыми. Строковый литерал может содержать стандартные ссылки на сущности, которые являются последовательностью символов. Последовательность начинается с амперсанда, представляющего отдельный символ, который в других случаях может иметь синтаксическую значимость. Далее приводятся стандартные ссылки на сущности в выражениях XQuery.

Ссылка на сущность

Представляет

<

<

&gt;

>

&amp;

&

&quot;

"

&apos;

'

Строковый литерал также может содержать символьную ссылку, XML-ссылку на символ Юникода, определяемую десятичным или шестнадцатеричным элементом кода. Например, знак евро может представляться символьной ссылкой «&#8364;».

Примечание

SQL Server использует XML версии 1.0 в качестве основы при синтаксическом анализе.

Примеры

Следующие примеры иллюстрируют применение литералов, а также ссылок на сущности и символы.

Этот код возвращает ошибку, поскольку символы <' и '> имеют специальное значение:

DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO

При использовании вместо них ссылки на сущность запрос выполняется.

DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary &gt; 50000 and &lt; 100000</SalaryRange>')
GO

Следующий пример иллюстрирует использование символьной ссылки для представления знака евро:

DECLARE @var XML
SET @var = ''
SELECT @var.query(' <a>&#8364;12.50</a>')

Результат.

<a>€12.50</a>

В следующем примере разделителями в запросе являются апострофы. Таким образом, апостроф в строковом значении представляется двумя последовательными апострофами.

DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>I don''t know</a>')
Go

Результат.

<a>I don't know</a>

Встроенные логические функции true() и false() могут использоваться для представления логических значений, как показано в следующем примере.

DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>{true()}</a>')
GO

Конструктор прямых элементов задает выражение в фигурных скобках. Оно заменяется своим значением в итоговом XML-файле.

Результат.

<a>true</a>

Ссылки на переменные

Ссылка на переменную в выражении XQuery — это QName, перед которым ставится знак $. В данной реализации поддерживаются только ссылки на переменные без префиксов. Например, следующий запрос задает переменную $i в выражении FLWOR.

DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
 for $i in /root return data($i)')
GO

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

DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
DECLARE namespace x="http://X";
for $x:i in /root return data($x:i)')
GO

Для ссылок на переменные SQL можно использовать функцию расширения sql:variable(), как показано в следующем запросе.

DECLARE @price money
SET @price=2500
DECLARE @x xml
SET @x = ''
SELECT @x.query('<value>{sql:variable("@price") }</value>')

Результат.

<value>2500</value>

Ограничения реализации

Существуют следующие ограничения реализации.

  • Переменные с префиксами пространства имен не поддерживаются.

  • Импорт модулей не поддерживается.

  • Объявления внешних переменных не поддерживаются. В качестве решения этой проблемы можно использовать функцию sql:variable().

Выражения элементов контекста

Элементом контекста является элемент, обрабатываемый в текущем контексте выражения пути. Он инициализируется в экземпляре типа XML-данных, значение которого не равно NULL, с помощью узла документов. Кроме того, изменения в него можно вносить методом nodes() в контексте выражений XPath или предикатов [].

Элемент контекста возвращается выражением, содержащим точку (.). Например, следующий запрос проверяет каждый элемент <a> на наличие атрибута attr. Если этот атрибут присутствует, элемент возвращается. Следует отметить, что условие в предикате требует, чтобы контекстный узел определялся одной точкой.

DECLARE @var XML
SET @var = '<ROOT>
<a>1</a>
<a attr="1">2</a>
</ROOT>'
SELECT @var.query('/ROOT[1]/a[./@attr]')

Результат.

<a attr="1">2</a>

Вызовы функций

Предусмотрена возможность вызова встроенных функций XQuery, а также функций SQL Server sql:variable() и sql:column(). Список реализованных функций см. в разделе Функции XQuery для типа данных xml.

Ограничения реализации

Существуют следующие ограничения реализации.

  • Объявление функций в прологе XQuery не поддерживается.

  • Импорт функций не поддерживается.

См. также

Основные понятия

Построение XML (XQuery)