2016-03-04 103 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