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

How do I get the contents of all of the nodes in a root node with SQL and XQuery?

我有以下 table 结构:

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)

不过,似乎只是显示Key和XMLField的整个XML。

此外,我试过这个:

SELECT   sp.Key,
         x.XmlCol.Query('ForeignKey[text]')
FROM     SpecialTable AS sp
CROSS APPLY sp.XMLField.nodes('/RootNode') x(XmlCol)

而且我只得到第一个 ForeignKey 节点中的第一个值,而不是其他节点。

我做错了什么?

最诚挚的问候,

安静的莱尼

首先 - 如果您的数据看起来像 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 数据类型,这将 有效!! (无论如何它确实应该是)