如何使用SQL和XQuery获取根节点中所有节点的内容?

时间:2015-05-09 12:59:13

标签: tsql sql-server-2012 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)

但是,它似乎只是为了显示XML和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 个答案:

答案 0 :(得分: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)

如果您的XMLField列属于XML数据类型,那么会有效(无论如何它应该是真的)