我有一个类似于以下格式的XML文件:
<XML>
<Field1>100</Field1>
<Field2>200</Field2>
<Field3>300</Field3>
<Test>400</Test>
</XML>
我需要编写一个查询来获取以Field
开头的所有元素值。因此,鉴于上面的XML,结果应该是
FieldVal
--------
100
200
300
我已尝试过以下操作但不起作用:
Select
xc.value('text()', 'int')
From
@XMLData.nodes('/XML/[starts-with(name(), ''Field'')]') As xt(xc)
注意:我很清楚如果我重新格式化我的XML可以轻松完成此任务,但遗憾的是我无法控制XML的格式。
答案 0 :(得分:4)
一种方法是
declare @XMLData xml ='<XML>
<Field1>100</Field1>
<Field2>200</Field2>
<Field3>300</Field3>
<Test>400</Test>
</XML>'
Select
xc.value('.', 'int')
From @XMLData.nodes('/XML/*') As xt(xc)
WHERE xc.value('local-name(.)', 'varchar(50)') LIKE 'Field%'
答案 1 :(得分:4)
带有特殊字符的前缀名称和检查包含。
declare @x xml ='<XML>
<Field1>100</Field1>
<Field2>200</Field2>
<Field3>300</Field3>
<Test>400</Test>
</XML>';
select t.n.value('.','varchar(100)')
from @x.nodes ('XML/*[contains(concat("$",local-name()),"$Field")]') t(n);
答案 2 :(得分:4)
我认为这就是你要找的东西:
DECLARE @xml XML=
'<XML>
<Field1>100</Field1>
<Field2>200</Field2>
<Field3>300</Field3>
<Test>400</Test>
</XML>';
SELECT Fld.value('.','int') AS FieldOnly
FROM @xml.nodes('/XML/*[substring(local-name(.),1,5)="Field"]') AS A(Fld)
仅仅因为评论中的讨论:
DECLARE @fldName VARCHAR(100)='Field';
SELECT Fld.value('.','int') AS FieldOnly
FROM @xml.nodes('/XML/*[substring(local-name(.),1,string-length(sql:variable("@fldName")))=sql:variable("@fldName")]') AS A(Fld)
将第一行更改为“测试”(区分大小写!),您只需获得400行的一行...