Поделиться через


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

Область применения: SQL Server

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

Литералы

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

Справочник по сущностям Представляет
&lt; <
&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>€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="https://X";  
for $x:i in /root return data($x:i)')  
GO  

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

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)