我正在解析 XML 并尝试获取节点的所有属性/值。
declare @XBL xml='
<Root>
<Department>
<Employees>
<Employee type="temp">
Jason
</Employee>
<Employee type="perm">
Roy
</Employee>
</Employees>
</Department>
<Department>
<Employees >
<Employee type="temp2">
Kevin
</Employee>
</Employees>
</Department>
</Root>'
SELECT
[Type] = XC.value('(@type)[1]', 'varchar(25)'),
[Name] = XC.value('(../Employee)[1]' , 'varchar(30)')
FROM
@XBL.nodes('Root/Department/Employees/Employee') AS XTbl(XC)
上述查询的输出 为我提供了所有属性,但只有第一个值(Jason)。
Type Name
temp Jason
perm Jason
temp2 Kevin
预期输出:
Type Name
temp Jason
perm Roy
temp2 Kevin
最佳答案
这应该是你想要的:
SELECT XBL.E.value('@type','varchar(25)') AS [Type],
XBL.E.value('(./text())[1]','varchar(30)') AS [Name]
FROM @XBL.nodes('Root/Department/Employees/Employee') XBL(E);
还要注意 /text()
的使用。从节点内部返回数据时,添加 /text()
实际上可以提高查询的性能。
编辑:此外,根据您的示例 xml,[Name]
返回的值实际上是 '{Line break} Jason{Line break}'
(显然用实际字符替换换行符)。这是您的意图,还是您也希望删除空格和换行符/回车符?
关于sql - XML 到 SQL Server 解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51175407/