如何使用SQL和XQuery获取根节点中所有节点的内容?
问题描述:
我有以下表结构:如何使用SQL和XQuery获取根节点中所有节点的内容?
CREATE TABLE SpecialTable
(
Key UNIQUEIDENTIFIER,
XMLField VARCHAR(MAX)
)
在第一元组:
Key = "28384841-17283848-7836-18292939"
XMLField =
"<RootNode>
<ForeignKey>92383829-27374848-1298-19283789</ForeignKey>
<ForeignKey>47585853-27374848-4759-19283939</ForeignKey>
<ForeignKey>37383829-27374848-3747-19283930</ForeignKey>
</RootNode>"
在另一元组,我看到:
Key = "89984841-17283848-7836-18292939"
XMLField =
"<RootNode>
<ForeignKey>92383829-27374848-1298-19283789</ForeignKey>
<ForeignKey>37383829-27374848-3747-19283930</ForeignKey>
</RootNode>"
在另一元组,我看到:
Key = "11114841-17283848-7836-18292939"
XMLField =
"<RootNode>
<ForeignKey>37383829-27374848-3747-19283930</ForeignKey>
</RootNode>"
我需要做的是得到以下数据集进行:
Key ForeignKey
28384841-17283848-7836-18292939 92383829-27374848-1298-19283789
28384841-17283848-7836-18292939 47585853-27374848-4759-19283939
28384841-17283848-7836-18292939 37383829-27374848-3747-19283930
89984841-17283848-7836-18292939 92383829-27374848-1298-19283789
89984841-17283848-7836-18292939 37383829-27374848-3747-19283930
11114841-17283848-7836-18292939 37383829-27374848-3747-19283930
我必须说,这是一个简单的数据集和数据比这更复杂,我已经到了一个地步,我不能进一步得到。
我已经试过这样:
SELECT sp.Key,
x.XmlCol.Query('.')
FROM SpecialTable AS sp
CROSS APPLY sp.XMLField.nodes('/RootNode') x(XmlCol)
然而,似乎只是为了显示键和整个XMLField的XML的。
而且,我尝试这样做:
SELECT sp.Key,
x.XmlCol.Query('ForeignKey[text]')
FROM SpecialTable AS sp
CROSS APPLY sp.XMLField.nodes('/RootNode') x(XmlCol)
,我在第一时间拿到ForeignKey的节点,只有第一个值,而不是别人。
我在做什么错?
最亲切的问候,
QuietLeni
答
首先的 - 如果你的数据看起来像XML,叫声也像XML,闻起来像XML - 那么它IS XML,你应该使用XML
数据类型存储它!
另外:要知道,Key
是一个非常通用的术语,也是T-SQL保留关键字,所以它是一个非常糟糕的列名 - 使用的东西更有意义不会有冲突关键词!
一旦你做到了这一点,你应该能够使用这个代码,以获得您想要的结果:
SELECT
[Key],
ForeignKey = xc.value('.', 'varchar(50)')
FROM
dbo.SpecialTable
CROSS APPLY
XMLField.nodes('/RootNode/ForeignKey') AS XT(XC)
这将只有工作,如果你列XMLField
是XML
数据类型的! (它实际上应该是反正)
这太棒了!周五我正好在那里寻找几个小时。我必须承认,但是,我确实在星期六从记忆中写下了这篇文章。最后,我所查询的领域并不是我所做的。 SQL是针对专有数据库的内部表的报表。再次感谢! – QuietLeni