2015-05-09 79 views
0

我有以下表结构:如何使用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

回答

1

首先的 - 如果你的数据看起来像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) 

这将只有工作,如果你列XMLFieldXML数据类型的! (它实际上应该是反正)

+0

这太棒了!周五我正好在那里寻找几个小时。我必须承认,但是,我确实在星期六从记忆中写下了这篇文章。最后,我所查询的领域并不是我所做的。 SQL是针对专有数据库的内部表的报表。再次感谢! – QuietLeni