xquery解析键值格式对XML

时间:2016-03-04 18:41:24

标签: sql-server xml xquery

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

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 个答案:

答案 0 :(得分:2)

首先使用以下查询来粉碎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 ║
╚════════╩══════╩══════╝
相关问题