我无法使用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)
答案 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 ║
╚════════╩══════╩══════╝