XML到SQL Server解析问题
我正在解析下面的XML并尝试获取节点的所有属性/值XML到SQL Server解析问题,sql,sql-server,xml,Sql,Sql Server,Xml,我正在解析下面的XML并尝试获取节点的所有属性/值 declare @XBL xml=' <Root> <Department> <Employees> <Employee type="temp"> Jason </Employee> <Employee type=
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)
预期输出:
Type Name
temp Jason
perm Roy
temp2 Kevin
您正在选择父部门的第一个员工子级:
[Name] = XC.value('(../Employee)[1]' , 'varchar(30)'
^^^^^^^^^^^^^^^^
要选择当前员工,请使用:
[Name] = XC.value('(.)[1]' , 'varchar(30)')
^^^^^^
这应该是你想要的:
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}
(显然用实际字符替换换行符)。这是您想要的,还是您希望删除空格和换行符/回车符
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);