在 SQL 服务器中检索所有具有相同前缀的 XML 元素
Retrieve all XML elements with the same prefix in SQL Server
我有一个 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.
一种方法是
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%'
使用特殊字符作为前缀名称并检查是否包含。
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);
我想这就是您要找的:
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)
将第一行更改为 "Test"(区分大小写!),您将只得到一行 400...
我有一个 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.
一种方法是
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%'
使用特殊字符作为前缀名称并检查是否包含。
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);
我想这就是您要找的:
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)
将第一行更改为 "Test"(区分大小写!),您将只得到一行 400...