如何在SQL Server 2008中选择XML文档中的每个标记?

5

我想知道是否有可能在T-SQL中进行查询,以选择我的XML文档中每个标记的值。

我不知道有多少标记,也不知道它们的名称,因为它应该是动态的......输出格式不重要(可以稍后处理),唯一重要的是我从每个标记获取数据:)

谢谢

3个回答

2
您可以尝试像这样做:

您可以尝试类似于以下的操作:

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
declare @xml xml

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

0

您可以使用openxml来获取一个edge表。它将为您提供节点值以及属性值。如果您有包含节点和文本混合的复杂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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接