2013-11-15 167 views
4

给定一个XML类型的字符串,如获取XML元素的名称,并使用SQL XPath查询

declare @xml xml 

SET @xml = 
'<PO> 
    <Amount type="approved">10.00</Amount> 
    <Year type="">2013</Year> 
    <GeneralNotes> 
    <Note> 
     <NoteText type="instruction">CallVendor</NoteText> 
     <Date type="">1-1-2013</Date> 
    </Note> 
    <Note type=""> 
     <NoteText type="instruction">ShipNow</NoteText> 
     <Date type="">2-2-2013</Date> 
    </Note> 
    </GeneralNotes> 
</PO>' 

我想每一个元素和它的属性,如果它有一个属性值。我需要的输出(不重复)是

ElementName ElementAttribute 

PO 
Amount approved 
Note  instruction 

我已经试过类似这样行

SELECT T.doc.query('fn:local-name(.)') 
FROM @xml.nodes('PO//*[1]') AS T(doc) 

这带来了一式两份,我不知道如何选择属性值代码。我只需要首次出现(即,GeneralNotes/Note[1])。我有许多其他元素名称的大文件,所以我不想单独解析它们。

回答

1
SELECT DISTINCT 
     T.doc.value('fn:local-name(..)[1]', 'nvarchar(max)') as ElementName, 
     T.doc.value('.', 'nvarchar(max)') as ElementAttribute 
FROM @xml.nodes('PO//@*[1]') AS T(doc) 
WHERE T.doc.value('.', 'nvarchar(max)') <> '' 

结果:

ElementName  ElementAttribute 
--------------- ---------------- 
Amount   approved 
NoteText  instruction 
+0

非常有帮助,谢谢! – rguy

0
select distinct 
    a.c.value('local-name(..)', 'nvarchar(max)') as ElementName, 
    a.c.value('.', 'nvarchar(max)') as ElementAttribute 
from @xml.nodes('//@*[. != ""]') as a(c) 

sql fiddle demo

+0

非常有帮助,也是答案。 – rguy