2012-08-13 69 views
2

我在查看是否可以在T-SQL中进行查询,该查询将从我的XML文档的每个标记中选择的值。如何从SQL Server 2008中的XML文档中选择每个标记?

我不知道有多少标签可以存在,我不知道他们的名字,因为它应该是动态的... 它不是重要的输出格式(它可以稍后操作),只有这是事情的事情是,我从每一个标签:)获取数据

谢谢

回答

0

你可以尝试这样的事情:

DECLARE @input XML = '..... add your XML here........' 

SELECT 
    NodeName = Nod.value('local-name(.)', 'varchar(50)'), 
    NodeValue = Nod.value('.', 'varchar(50)') 
FROM @input.nodes('//*') AS TBL(Nod) 

这将列出所有节点 - 名称和值 - 在你的XML。

警告:我只是随机选取varchar(50)作为XML节点元素的数据类型。如果这不适合你 - 根据需要进行调整!既然你把它们转换一下子,你必须将它们全部转换为相同的数据类型 - 和varchar似乎是一个比较安全的选择:-)

+0

谢谢两位。这工作很好。 – Bokac 2012-08-13 14:09:24

0
declare @xml xml 

select 
    x.n.query('local-name(.)'), 
    x.n.value('(text())[1]','varchar(100)') 
from @xml.nodes('//.') x(n) 
0

您可以使用openxml得到一个边缘表。它会给你节点值和属性值。如果你有复杂的XML和节点和文本的混合,你会得到值分割在不同的行。

declare @xml xml 

set @xml = 
'<root Attrib="RootAttribute"> 
    <item>Value item 1</item> 
    <item> 
    Value item 2 
     <subitem>sub value in 2</subitem> 
    More text in item 2 
    </item> 
</root>' 

declare @idoc int 
exec sp_xml_preparedocument @idoc out, @xml 

select * 
from openxml(@idoc, '') 

exec sp_xml_removedocument @idoc 

结果:

id parentid nodetype localname prefix namespaceuri datatype prev text 
0 NULL  1  root  NULL NULL   NULL  NULL NULL 
2 0  2  Attrib NULL NULL   NULL  NULL NULL 
8 2  3  #text  NULL NULL   NULL  NULL RootAttribute 
3 0  1  item  NULL NULL   NULL  NULL NULL 
9 3  3  #text  NULL NULL   NULL  NULL Value item 1 
4 0  1  item  NULL NULL   NULL  3 NULL 
6 4  3  #text  NULL NULL   NULL  NULL Value item 2 
5 4  1  subitem NULL NULL   NULL  6 NULL 
10 5  3  #text  NULL NULL   NULL  NULL sub value in 2 
7 4  3  #text  NULL NULL   NULL  5 More text in item 2 
相关问题