Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML到SQL Server解析问题_Sql_Sql Server_Xml - Fatal编程技术网

XML到SQL Server解析问题

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=

我正在解析下面的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)
预期输出:

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);