Получение значения из моего xml
Я не уверен, что правильный элемент / узел / или любое другое имя для возврата этого значения, но вот мой пример xml:
DECLARE @Input xml = '
<root>
<myValue>
<more></more>
<more></more>
</myValue>'
<root>
То, что я пытаюсь получить отсюда, является результатом "myValue". Буквенная строка "myValue" - это то, что мне нужно. Таким образом, возможно, имя первого узла может быть правильным способом его формулировки? Вот что я пробовал, куда я иду не так?
SELECT @Input.value('local-name(/*[1])','varchar(100)')
SELECT Nodes.Name.query('local-name(.)') FROM @Input.nodes('//*[1]') As Nodes(Name)
2 ответа
Этот вопрос совершенно неясен...
Посмотрите на этот пример, чтобы найти различные подходы, чтобы прочитать это:
DECLARE @Input xml =
'<root>
<myValue>value 1
<more>more 1</more>
value 2
<more>more 2</more>
value 3
</myValue>
</root>';
- Получить значения с разных позиций
SELECT @Input.value('(/root/myValue/text())[2]','nvarchar(max)') AS SecondFloatingTextInMyValue
,@Input.value('(/root/myValue/more/text())[1]','nvarchar(max)') FirstMoreElement
,@Input.value('(/root/myValue/more/text())[2]','nvarchar(max)') SecondMoreElement;
- получить производную таблицу <more>
-элементов
SELECT More.Nodes.value('(./text())[1]','nvarchar(max)') AS MoreValue
FROM @Input.nodes('/root/myValue/more') AS More(Nodes)
ОБНОВИТЬ
Ваш вопрос
То, что я пытаюсь получить отсюда, это просто значение myValue
кажется, ищет значение элемента, но, как показывает ваш ответ, вы, похоже, ищете имя элемента, где "more" - просто пример...
Пожалуйста, прочтите Как задать хороший вопрос SQL и Как создать MCVE
ОБНОВЛЕНИЕ 2
Чтение метаданных элемента выполняется, как вы сами, с помощью local-name()
:
DECLARE @Input xml =
'<root>
<myValue>
<OneValue></OneValue>
<Another></Another>
</myValue>
</root>';
SELECT nd.value('local-name(.)','nvarchar(max)') AS NameOfNodeBelowMyValue
FROM @Input.nodes('/root/myValue/*') AS A(nd)
Я понял это, извините, что беспокою. Я не уверен, что технический термин того, что я искал здесь, но в моем случае узел 'myValue' содержит имя объекта dbo.Table, который мне нужен для динамического запроса.
SELECT Nodes.Name.query('local-name(.)')
FROM @Input.nodes('/root/*[1]') As Nodes(Name)