Первичные выражения (XQuery)
Область применения: SQL Server
Первичные выражения XQuery включают литералы, ссылки на переменные, выражения элементов контекста, конструкторы и вызовы функций.
Литералы
Литералы выражений XQuery могут быть строковыми или числовыми. Строковый литерал может содержать стандартные ссылки на сущности, которые являются последовательностью символов. Последовательность начинается с амперсанда, представляющего отдельный символ, который в других случаях может иметь синтаксическую значимость. Далее приводятся стандартные ссылки на сущности в выражениях XQuery.
Справочник по сущностям | Представляет |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
Строковый литерал также может содержать символьную ссылку, 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 > 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="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 не поддерживается.
Импорт функций не поддерживается.