2016-03-04 109 views
0

我无法使用xquery解析键值对XML。该列是一个元素,值是另一个元素。我想要得到预期的结果如下图所示:xquery解析键值对格式XML XML

Status year Name 
ACCCESS 2016 Mike 


declare @xml xml 
set @xml=' 
<DATA> 
    <NVPAIRS> 
     <PAIR> 
     <NAME>Status</NAME> 
     <VALUE>ACCESS</VALUE> 
     </PAIR> 
     <PAIR> 
     <NAME>year</NAME> 
     <VALUE>2016</VALUE> 
     </PAIR> 
     <PAIR> 
     <NAME>Name</NAME> 
     <VALUE>Mike</VALUE> 
     </PAIR> 
    </NVPAIRS> 
</DATA> 
' 
--???????????? 
select 
status = pd.value('/NAME="status"', 'varchar(50)') 
from 
@xml1.nodes('//PAIR') as i(pd) 

回答

1

首先使用下面的查询撕碎你的XML:

select pd.value('(NAME)[1]', 'varchar(50)') ColumnName 
    , pd.value('(VALUE)[1]', 'varchar(50)') ColumnValue 
from @xml.nodes('//DATA/NVPAIRS/PAIR') as i(pd) 

这将获得在SQL中使用以下格式的数据:

╔════════════╦═════════════╗ 
║ ColumnName ║ ColumnValue ║ 
╠════════════╬═════════════╣ 
║ Status  ║ ACCESS  ║ 
║ year  ║ 2016  ║ 
║ Name  ║ Mike  ║ 
╚════════════╩═════════════╝ 

现在你可以使用上面的查询与PIVOT一起转动你的数据,它会看起来像....

Select * 
FROM 
    (
    select pd.value('(NAME)[1]', 'varchar(50)') ColumnName 
     , pd.value('(VALUE)[1]', 'varchar(50)') ColumnValue 
    from @xml.nodes('//DATA/NVPAIRS/PAIR') as i(pd) 
    )a 
     PIVOT (MAX(ColumnValue) 
       FOR ColumnName 
       IN ([Status],[year],[Name]) 
      )p 

最终的结果集看起来你是什么后:

╔════════╦══════╦══════╗ 
║ Status ║ year ║ Name ║ 
╠════════╬══════╬══════╣ 
║ ACCESS ║ 2016 ║ Mike ║ 
╚════════╩══════╩══════╝ 
+0

非常感谢您的帮助。 – Mike