我有以下结构,在根目录下的第二级具有可变数量的元素,名称未知:
<root>
<A>text a</A>
<B>text b</B>
</root>
我需要一个在第二级提供特定元素文本的查询。所需元素的名称是用户传入的参数。
我已经成功地找到了它,例如元素“A”,查询存储在变量@x 中的 XML 文档:
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)
这适用于“A”,但现在我需要用变量或任何类型的过滤替换“A”......所以我需要这样的东西:
SELECT xLangStruct.x.value('(@SEARCHEDELEMENT/text())[1]', 'varchar(100)') from @x.nodes('//root') as xLangStruct(x)
或者
SELECT xLangStruct.x.value('(./text())[1]', 'varchar(100)') from @x.nodes('//root') as xLangStruct(x) WHERE xLangStruct.x.Elementname = @SEARCHEDELEMENT
虽然 Mikael Eriksson 在 XML 方面没有任何问题(毕竟,他是我的精神 XML 指南),但这里有一个针对您的问题的特定答案。
您只需稍微改变处理 XML 的方式。我还稍微更改了 XML,以排除在节点名称中搜索 A 和 B 到文本 1 和文本 2 的误报。
这将返回文本 1。
这将返回文本 2。