Я пытаюсь запросить таблицу со столбцом, который представляет собой данные XML с функциями запроса и значения. При использовании обычных строковых литералов все нормально, но если я помещу это в хранимую процедуру и попытаюсь использовать переменные, это не сработает.
Полагаю, я не использую правильный тип данных, но после некоторого поиска я не могу понять, какой тип данных нужна функции запроса.
Пример:
таблица содержит
| Id | xmldata |
| 1 | <data><node>value</node></data> |
сейчас, используя запрос на выборку
select id
from table
where xmldata.query('/data/node').value('.', 'VARCHAR(50)') = 'value'
получает мне данные, которые я хочу. Но если я использую это в хранимой процедуре, использую параметр @xpath varchar(100)
и передаю его методу запроса как xmldata.query(@xpath)
я получаю ошибку
The argument 1 of the xml data type method "query" must be a string literal.
Полагаю, varchar (100) неверен, но какой тип данных я могу использовать, чтобы MSSQL был счастлив?
Обновление:
Хорошо, итак. Очевидно, вы не можете передать параметр методу запроса «просто так», но можно использовать переменную sql: в сочетании с local-name, чтобы обработать его часть. Так, например, это будет работать
declare @xpath VarChar(100)
set @xpath='node'
select objectData.query('/data/*[local-name() = sql:variable("@xpath")]')
.value('.', 'varchar(100)') as xmldata
from table
и значение выбирается в столбце xmldata. Но (!) Это требует, чтобы корневой узел был первым значением в функции запроса. Следующее не работает
declare @xpath VarChar(100)
set @xpath='/data/node'
select objectData.query('*[local-name() = sql:variable("@xpath")]')
.value('.', 'varchar(100)') as xmldata
from table
обратите внимание, как путь запроса «перемещается» вверх к переменной. Я продолжу свои исследования ..