【发布时间】:2012-08-13 13:02:11
【问题描述】:
我正在寻找是否可以在 T-SQL 中进行查询,该查询将从我的 XML 文档的 每个 标记中选择值。
我不知道可以有多少个标签,也不知道它们的名字,因为它应该是动态的... 这不是重要的输出格式(可以稍后操作),唯一重要的是我从每个标签中获取数据:)
谢谢
【问题讨论】:
标签: sql xml sql-server-2008
我正在寻找是否可以在 T-SQL 中进行查询,该查询将从我的 XML 文档的 每个 标记中选择值。
我不知道可以有多少个标签,也不知道它们的名字,因为它应该是动态的... 这不是重要的输出格式(可以稍后操作),唯一重要的是我从每个标签中获取数据:)
谢谢
【问题讨论】:
标签: sql xml sql-server-2008
你可以试试这样的:
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 似乎是一个相当安全的选择:-)
【讨论】:
declare @xml xml
select
x.n.query('local-name(.)'),
x.n.value('(text())[1]','varchar(100)')
from @xml.nodes('//.') x(n)
【讨论】:
您可以使用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
【讨论】: