Первичные выражения (XQuery)
Первичные выражения XQuery включают литералы, ссылки на переменные, выражения элементов контекста, конструкторы и вызовы функций.
Литералы
Литералы выражений XQuery могут быть строковыми или числовыми. Строковый литерал может содержать стандартные ссылки на сущности, которые являются последовательностью символов. Последовательность начинается с амперсанда, представляющего отдельный символ, который в других случаях может иметь синтаксическую значимость. Далее приводятся стандартные ссылки на сущности в выражениях XQuery.
Ссылка на сущность |
Представляет |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
Строковый литерал также может содержать символьную ссылку, XML-ссылку на символ Юникода, определяемую десятичным или шестнадцатеричным элементом кода. Например, знак евро может представляться символьной ссылкой «€».
Примечание |
---|
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 > 50000 and < 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="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 Serversql:variable() и sql:column(). Список реализованных функций см. в разделе Функции XQuery для типа данных xml.
Ограничения реализации
Существуют следующие ограничения реализации.
Объявление функций в прологе XQuery не поддерживается.
Импорт функций не поддерживается.