Eu tenho a seguinte estrutura com um número variável de elementos no 2º nível na raiz com nomes desconhecidos:
<root>
<A>text a</A>
<B>text b</B>
</root>
Preciso de uma consulta que entregue o texto de um elemento específico no 2º nível. o nome do elemento requerido é o argumento passado por um usuário.
Já consegui encontrar por exemplo para o elemento "A", consultando o documento XML armazenado na variável @x:
declare @str varchar(1000) = '<root><A>text a</A><B>text b</B></root>'
declare @x xml = convert(xml, @str)
SELECT xLangStruct.x.value('(A/text())[1]', 'varchar(100)') from @x.nodes('//root') as xLangStruct(x)
Isso funciona para "A", mas agora preciso substituir "A" por uma variável ou qualquer tipo de filtragem ... Então, preciso de algo assim:
SELECT xLangStruct.x.value('(@SEARCHEDELEMENT/text())[1]', 'varchar(100)') from @x.nodes('//root') as xLangStruct(x)
ou
SELECT xLangStruct.x.value('(./text())[1]', 'varchar(100)') from @x.nodes('//root') as xLangStruct(x) WHERE xLangStruct.x.Elementname = @SEARCHEDELEMENT
Embora não haja problemas com Mikael Eriksson quando se trata de XML (ele é, afinal, meu guia espiritual de XML), aqui está uma resposta específica para sua pergunta.
Você só precisa mudar um pouco a maneira como está lidando com o XML. Eu também mudei o XML um toque para descartar falsos positivos procurando por A e B nos nomes dos nós para texto 1 e texto 2.
Isso retorna o texto 1.
Isso retorna o texto 2.